要解析的示例数据(unicode字符串列表):
[u'\n', u'1\xa0', u'Some text here.', u'\n', u'1\xa0', u'Some more text here.',
u'\n', u'1\xa0', u'Some more text here.']
Run Code Online (Sandbox Code Playgroud)
我想\xa0从这些字符串中删除.
编辑: 当前方法不起作用:
def remove_from_list(l, x):
return [li.replace(x, '') for li in l]
remove_from_list(list, u'\xa0')
Run Code Online (Sandbox Code Playgroud)
我仍然得到完全相同的输出.
每个版本的代码都存在不同的问题.让我们从这开始:
newli = re.sub(x, '', li)
l[li].replace(newli)
Run Code Online (Sandbox Code Playgroud)
首先,newli是已经你想,这就是行re.sub做,所以你不需要replace在这里的.只需分配newli.
第二,l[li]不会起作用,因为li是行的价值,而不是指数.
在这个版本中,它是一个但更微妙的:
li = re.sub(x, '', li)
Run Code Online (Sandbox Code Playgroud)
re.sub正在返回一个新字符串,并且您正在将该字符串分配给li.但这不会影响列表中的任何内容,只是说" li不再引用列表中的当前行,它现在引用这个新字符串".
要只替换列表元素是获取索引,以便您可以使用[]运算符.为了得到它,你想要使用enumerate.
所以:
def remove_from_list(l, x):
for index, li in enumerate(l):
l[index] = re.sub(x, '', li)
return l
Run Code Online (Sandbox Code Playgroud)
但实际上,您可能确实想要使用str.replace-it只是因为您想要使用它而不是re.sub:
def remove_from_list(l, x):
for index, li in enumerate(l):
l[index] = li.replace(x, '')
return l
Run Code Online (Sandbox Code Playgroud)
那么你不必担心如果x正则表达式中有特殊字符会发生什么.
此外,在Python中,您几乎从不想要就地修改对象,也返回它.修改它并返回None,或返回该对象的新副本.那么,要么:
def remove_from_list(l, x):
for index, li in enumerate(l):
newli = li.replace(x, '')
l[index] = newli
Run Code Online (Sandbox Code Playgroud)
… 要么:
def remove_from_list(l, x):
new_list = []
for li in l:
newli = li.replace(x, '')
new_list.append(newli)
return new_list
Run Code Online (Sandbox Code Playgroud)
你可以简单地将后者用于列表理解,就像在unutbu的答案中一样:
def remove_from_list(l, x):
new_list = [li.replace(x, '') for li in l]
return new_list
Run Code Online (Sandbox Code Playgroud)
事实上,第二个更容易编写(不需要enumerate,有一个方便的快捷方式等)并非巧合 - 它通常是你想要的,所以Python使它变得容易.
我不知道如何使这更清楚,但最后一次尝试:
如果选择返回列表的固定新副本的版本而不是就地修改列表,则不会以任何方式修改原始列表.如果要使用已修复的新副本,则必须使用该函数的返回值.例如:
>>> def remove_from_list(l, x):
... new_list = [li.replace(x, '') for li in l]
... return new_list
>>> a = [u'\n', u'1\xa0']
>>> b = remove_from_list(a, u'\xa0')
>>> a
[u'\n', u'1\xa0']
>>> b
[u'\n', u'1']
Run Code Online (Sandbox Code Playgroud)
你的实际代码将所有代码转换为1个字符和0个字符的字符串列表的问题是你实际上没有一个字符串列表,你有一个字符串是repr一个列表字符串.所以,for li in l意思是"对于li字符串中的每个字符l,而不是for each stringli in the listl`.
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |