的问题是在你的代码的每个版本不同。让我们先从这一点:
newli = re.sub(x, '', li)
l[li].replace(newli)
首先,newli
是已经你想,这就是re.sub
行做,所以你不需要replace
这里都没有。只需分配newli
。
其次,l[li]
是行不通的,因为li
是该行的值,而不是指数。
在这个版本中,这是一个更微妙:
li = re.sub(x, '', li)
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
但实际上,你可能做想用str.replace
只是想用它代替的re.sub
- 它是:
def remove_from_list(l, x):
for index, li in enumerate(l):
l[index] = li.replace(x, '')
return l
然后你不必担心如果x
是正则表达式中的特殊字符会发生什么情况。
另外,在Python中,你几乎从不想修改对象的原地位置,并且也返回它。修改它并返回None
,或者返回该对象的新的副本。所以,无论是:
def remove_from_list(l, x):
for index, li in enumerate(l):
newli = li.replace(x, '')
l[index] = newli
...或:
def remove_from_list(l, x):
new_list = []
for li in l:
newli = li.replace(x, '')
new_list.append(newli)
return new_list
你可以简单的后者列表理解,在unutbu的回答是:
def remove_from_list(l, x):
new_list = [li.replace(x, '') for li in l]
return new_list
事实上,第二个更容易编写(不需要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']
你与你的实际代码转向到一切的1字符和0字符字符串列表中遇到的问题是,你实际上没有字符串列表中首先,你有一个字符串,它是一个字符串列表的repr
。所以,for li in l
手段“的字符串l
中的每个字符li
,而不是for each string
李in the list
l`。
你有没有尝试过任何东西 –
是的,我会告诉我的尝试 – Dan
检查这些,http://stackoverflow.com/questions/3939361/remove-specific-字符从一个字符串在Python中,http://www.tutorialspoint.com/python/string_replace.htm – Rupak