从列表python中删除两个连续的元素

时间:2019-02-27 10:57:40

标签: python list

从列表中删除连续的元素存在问题。 例如,我有一个列表;

['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函数跳过第二个。

我如何删除这些单词?

6 个答案:

答案 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)