【问题标题】:Removing elements from a list containing specific characters [duplicate]从包含特定字符的列表中删除元素[重复]
【发布时间】:2011-03-25 21:20:53
【问题描述】:

我想删除列表中包含(或不包含)一组特定字符的所有元素,但是我遇到了迭代列表和删除元素时遇到的问题。下面给出了两个几乎相同的例子。如您所见,如果两个应该删除的元素直接紧随其后,则第二个元素不会被删除。

我确信在 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']

仍然想知道在使用 for x in l 时是否有任何方法可以将迭代设置回一组。

【问题讨论】:

    标签: python list data-structures


    【解决方案1】:

    列表推导:

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

    【讨论】:

    • MattH,很抱歉,是否可以这样做 if "1" or "2" or "3" not in x。也就是说,等价于[ x for x in l if "1" not in x ] + [ x for x in l if "2" not in x ] + [ x for x in l if "3" not in x ],但更短?谢谢。
    • @СашаЧерных 你在描述[x for x in l if any(y not in x for y in '123')],但我认为你实际上想要[x for x in l if all(y not in x for y in '123')]
    【解决方案2】:

    如果我理解正确的话,

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

    或许能胜任。

    【讨论】:

      【解决方案3】:

      除了@Matth,如果你想组合多个语句你可以写:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2020-06-17
          • 2014-11-08
          • 2018-09-08
          • 2013-04-16
          • 2020-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多