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

时间:2015-02-25 13:47:24

标签: python list ascii

考虑以下列表: (我忘了提到我的列表也有数字,int-s)

foo_list = [['foo', 100], ['\xa0foo', 200], ['foo\xa0\xa0\xa0\xa0\xa0\xa0\xa0\xa0', 300], ['foo', 400]]

我尝试使用我在Google上搜索时使用的以下功能清理列表:

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 个答案:

答案 0 :(得分:2)

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

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

\xa0是一个不间断的空间,如果您的值是Unicode字符串,这些字符串将被删除而不指定参数。您的示例输入包含 bytestrings ,因此我使用了显式条带:

>>> 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]

但是,除非您在单词之间有str.replace()个不间断的空格,否则不需要使用\xa0;您的样本仅在开头和结尾包含它们。

请注意,如果某些元素是整数而其他元素是字符串,则必须进行一些鸭子输入:

[[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]]