Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从python列表中删除两个连续的元素_Python_List - Fatal编程技术网

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

从python列表中删除两个连续的元素,python,list,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) 输出为;仅找到

从列表中删除连续元素时出现问题。 例如,我有一份清单

['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,删除函数跳过第二个,因为删除过程后索引的变化


如何删除这些单词?

您可以使用列表理解根据条件筛选出元素:

>>> 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']

有关更多信息,请参阅。希望有帮助

您可以使用列表理解根据条件筛选出元素:

>>> 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']

有关更多信息,请参阅。希望有帮助

您不应更改正在迭代的列表,而应创建一个新列表:

b = [word for word in a if not '@' in word]

您不应更改正在迭代的列表,而应创建一个新列表:

b = [word for word in a if not '@' in word]

您需要将列表“a”添加到列表中。下面的代码可能会对您有所帮助

a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in list(a):
    if '@' in word:
        print("found @ in word :" +word)
        a.remove(word)

您需要将列表“a”添加到列表中。下面的代码可能会对您有所帮助

a = ['aaaaa', '@someword', '@otherword','bbbb']
for word in list(a):
    if '@' in word:
        print("found @ in word :" +word)
        a.remove(word)
另一种方法是您可以使用用户过滤器


另一种方法是用户筛选

不建议在循环列表时对列表元素进行变异

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']

在循环列表时,不建议对列表的元素进行变异

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']

这里的实际问题是,您正在编辑的列表中循环删除/添加项。这意味着,当您在第二个项目上删除项目2时,您将在下一次迭代中到达项目4

(0, 'aaaaa')
(1, '@someword')
['aaaaa', 'qqqq', '@otherword', 'bbbb']
(2, '@otherword')
['aaaaa', 'qqqq', 'bbbb']
解决方案是在列表的副本上循环,或者创建一个列表副本,然后使用列表理解返回该副本

可以使用word[:]创建列表的副本


这里的实际问题是,您正在编辑的列表中循环删除/添加项。这意味着,当您在第二个项目上删除项目2时,您将在下一次迭代中到达项目4

(0, 'aaaaa')
(1, '@someword')
['aaaaa', 'qqqq', '@otherword', 'bbbb']
(2, '@otherword')
['aaaaa', 'qqqq', 'bbbb']
解决方案是在列表的副本上循环,或者创建一个列表副本,然后使用列表理解返回该副本

可以使用word[:]创建列表的副本


你不应该修改你正在迭代的列表,我该怎么做?它在c或java中工作,python列表的逻辑区别是什么?我实际上不知道区别是什么;我不是一个专业的程序员,只熟悉python。但我认为这在C或java中仍然不是一个好的实践。你可能永远不应该修改你正在迭代的列表。所以,我怎么做呢?它在C或java中工作,python列表的逻辑区别是什么?我实际上不知道区别是什么;我不是一个专业的程序员,只熟悉python。但我认为在C或Java语言中,这仍然不是一个好的实践