2010-08-05 118 views
17

我想删除包含(或不包含)一组特定字符的列表中的所有元素,但是我遇到了迭代列表中的问题以及将元素作为我一直在前进。下面给出了两个几乎相同的例子。正如你所看到的,如果应该删除的两个元素直接跟在另一个之后,那么第二个元素不会被删除。删除包含特定字符的列表中的元素

我确定在Python中有这样一个非常简单的方法,所以如果有人知道它,请帮助我 - 我正在制作整个列表的副本并迭代一个,并删除其他元素...这不是个很好的解决方案,我认为

>>> l 
['1', '32', '523', '336'] 
>>> for t in l: 
...  for c in t: 
...   if c == '2': 
...    l.remove(t) 
...    break 
...    
>>> l 
['1', '523', '336'] 
>>> l = ['1','32','523','336','13525'] 
>>> for w in l: 
...  if '2' in w: l.remove(w) 
...  
>>> l 
['1', '523', '336'] 

想通了:

>>> l = ['1','32','523','336','13525'] 
>>> [x for x in l if not '2' in x] 
['1', '336'] 

仍想知道是否有任何方式使用中长x时设置迭代回一组虽然。

+0

Dupe-ish:http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while-iterating-in-python – bhangm 2010-08-05 15:43:22

+0

请接受帮助您解决问题的答案,而不是添加“解决”的标题。点击答案旁边的绿色复选标记以接受答案。 (如果没有答案帮助你,那么请添加你自己的答案,解释你是如何解决问题的。)谢谢,欢迎来到Stack Overflow。 – 2010-08-05 15:48:10

回答

35

列表解析:

>>> l = ['1', '32', '523', '336'] 
>>> [ x for x in l if "2" not in x ] 
['1', '336'] 
>>> [ x for x in l if "2" in x ] 
['32', '523'] 
6

如果我理解正确的话,

[x for x in l if "2" not in x] 

可能做的工作。

+1

与flake8风格不兼容。我收到一个错误:'SashaListComprehension.py:70:45:E713成员资格测试应该'不在'。对于flake8,我们需要“if”2“not”作为[** MattH答案**](https://stackoverflow.com/a/3416473/5951529),而不是“如果不是”“2”'。谢谢。 – 2018-01-01 08:47:11

+1

@СашаЧерных,谢谢,我已经编辑了答案 – loevborg 2018-03-01 19:46:55

0

您可能遇到的问题是,您正在尝试修改序列l,同时您在循环中对其进行循环。

相关问题