从列表中删除连续的元素存在问题。 例如,我有一个列表;
['aaaaa', '@someword', '@otherword','bbbb',...]
我想从具有@ char的列表元素中删除。
a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in a:
if '@' in word:
print("found @ in word :" +word)
a.remove(word)
输出为; (仅找到第一个元素,跳过第二个。)
found @ in word :@someword
如果我在此元素之间添加一些值;
a = ['aaaaa', '@someword', 'qqqq', '@otherword','bbbb']
它抓住了其中两个;
found @ in word :@someword
found @ in word :@otherword
我调试代码,如果有成功的某些单词包括@ char,则由于删除过程后索引的更改,remove函数跳过第二个。
我如何删除这些单词?
答案 0 :(得分:2)
您可以使用列表推导根据条件过滤掉元素:
>>> original = ['aaaaa', '@someword', '@otherword','bbbb']
>>> filtered = [item for item in original if '@' not in item]
>>> filtered
['aaaaa', 'bbbb']
或替换它们:
>>> replaced = [item if '@' not in item else '' for item in original]
>>> replaced
['aaaaa', '', '', 'bbbb']
有关更多信息,请参见documentation。希望对您有帮助!
答案 1 :(得分:2)
永远不要更改要遍历的列表,而要创建一个新列表:
b = [word for word in a if not '@' in word]
答案 2 :(得分:2)
您需要将列表“ a”添加到列表中。以下代码可能对您有帮助
a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in list(a):
if '@' in word:
print("found @ in word :" +word)
a.remove(word)
答案 3 :(得分:1)
word = ['aaaaa', '@someword', '@otherword','bbbb']
filtered = list(filter( lambda x : '@' not in x ,word))
另一种方式是您可以用户过滤
答案 4 :(得分:1)
在遍历列表时,不建议对列表元素进行变异。
a = ['aaaaa', '@someword', '@otherword','bbbb']
for index,word in enumerate(a):
print(index, word)
if '@' in word:
a.remove(word)
print(a)
此输出为
(0, 'aaaaa')
(1, '@someword')
['aaaaa', '@otherword', 'bbbb']
(2, 'bbbb')
从中您可以看到'@someword'被删除,索引2处的元素不再是'@otherword',现在是'bbbb'。因此无法删除“ @otherword”。
您提供的第二个示例行得通,因为删除'@someword'时索引2处的元素变为'@otherword',因此可以在下一次迭代时将其删除。
(0, 'aaaaa')
(1, '@someword')
['aaaaa', 'qqqq', '@otherword', 'bbbb']
(2, '@otherword')
['aaaaa', 'qqqq', 'bbbb']
我建议您创建一个新列表,并只存储其中不包含“ @”的元素
a = ['aaaaa', '@someword', 'qqqq', '@otherword','bbbb']
new_list = [i for i in a if '@' not in i]
print(new_list) # ['aaaaa', 'qqqq', 'bbbb']
答案 5 :(得分:1)
这里的实际问题是,您正在遍历正在编辑的列表(删除/添加项目)。这意味着当您在第二个项目上删除项目2时,将在下一个迭代中到达项目4。
解决方案是遍历列表的副本,或者创建列表的副本并将其返回(例如,使用列表理解)
可以使用word[:]
创建列表的副本。
a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in a[:]:
if '@' in word:
print("found @ in word :" +word)
a.remove(word)