考虑以下列表: (我忘了提到我的列表也有数字,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
的清除值。
答案 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()
从开头和结尾删除所有空格(因为\xa0
为U+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]]