从多维列表中删除'\xa0'字符

3
考虑以下列表: (我忘记提到我的列表还有数字,即整数)
foo_list = [['foo', 100], ['\xa0foo', 200], ['foo\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0', 300], ['foo', 400]]

我在谷歌搜索时发现了以下函数,尝试使用它来清理列表:

def remove_from_list(l, x):
  new_list = [li.replace(x, u'') for li in l]
  return new_list

foo_list_clean = remove_from_list(foo_list, u'\xa0')

这显然给了我一个新的错误。
AttributeError: 'int' object has no attribute 'replace'

是因为这是一个列表的列表吗?我该如何修改代码,使其正常工作并移除 '\xa0' 字符。

我的期望输出是一个新列表,其中包含来自 foo_list 的清理值。


1
你的字符串是字节串还是Unicode - Martijn Pieters
第一个元素只是一个字符串吗? - Martijn Pieters
问题有所改变,因为列表中还有数字。我在原帖中忘记提到了这一点。 - user3596479
是的,只有第一个元素是字符串。 - user3596479
1个回答

2

只需在第一个元素上使用str.strip(),保留内部列表的其余部分:

[[inner[0].strip('\xa0')] + inner[1:] for inner in foo_list]

\xa0 是一个不换行空格,如果你的值是Unicode字符串,则无需指定参数即可剥离它们。您的示例输入由 字节字符串 组成,因此我使用了显式剥离:

>>> foo_list = [['foo', 100], ['\xa0foo', 200], ['foo\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0', 300], ['foo', 400]]
>>> [[inner[0].strip('\xa0')] + inner[1:] for inner in foo_list]
[['foo', 100], ['foo', 200], ['foo', 300], ['foo', 400]]

您自己的方法也可以正常工作,但您需要对每个嵌套列表的切片使用该函数:

foo_list_clean = [remove_from_list(inner[:1], u'\xa0') + inner[1:] for inner in foo_list_clean]

然而,除非你的样本中有那些在单词之间的\xa0不间断空格,否则不需要使用str.replace();你的样本只包含它们在开头和结尾。

请注意,如果一些元素是整数而另一些元素是字符串,你将不得不进行一些鸭子类型检查:
[[s.strip('\xa0') if hasattr(s, 'strip') else s for s in inner]
 for inner in foo_list]

请注意,如果您的输入是unicode对象,则必须使用匹配的u'\xa0'字符串来进行剥离!或者,只需使用没有参数的unicode.strip()来从开头和结尾删除所有空格(因为\xa0U+00A0 NO-BREAK SPACE并被认为是空格):
>>> foo_list = [[u'foo', 100], [u'\xa0foo', 200], [u'foo\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0', 300], [u'foo', 400]]
>>> [[inner[0].strip()] + inner[1:] for inner in foo_list]
[[u'foo', 100], [u'foo', 200], [u'foo', 300], [u'foo', 400]]

由于某些原因,我无法获得所需的结果。但是,如果我使用另一个帖子提供的代码(他/她出于某种原因已删除),它可以正常工作:foo_list_clean = [[item.replace(u'\xa0', '') if isinstance(item, str) else item for item in items] for items in foo_list] - user3596479
@user3596479:在这里定义“不起作用”。你是指你的字符串中间有\xa0,还是所有的字符串都是真正的Unicode字符串,并且使用没有u前缀的'\xa0'(使它们成为字节字符串)会导致解码/编码问题,或者其他什么问题? - Martijn Pieters
@user3596479:请注意所提供的答案仅适用于您发布的示例数据。如果该数据不代表您实际的数据,请更新数据。 - Martijn Pieters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接