从包含特定字符的列表中删除元素

62
我想要删除列表中包含特定字符集(或不包含)的所有元素,但是在迭代列表并删除元素时遇到了问题。下面给出了两个几乎相同的例子。正如您所看到的,如果应该被删除的两个元素直接跟随在一起,则第二个元素不会被删除。
我确信在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时,是否有任何方法可以将迭代设置回上一组?

4个回答

113

列表推导式:

l = ['1', '32', '523', '336']

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

# Returns: ['1', '336']

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

# Returns: ['32', '523']
l = ['1', '32', '523', '336']
stringVal = "2"

print(f"{[ x for x in l if stringVal not in x ]}")

# Returns: ['1', '336']

print(f"{[ x for x in l if stringVal in x ]}")

# Returns: ['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')] - wjandrea
有人能解释一下这段代码吗?或者写出它的更长版本吗? - BARIS KURT
@СашаЧерных 有没有一种方法可以排除不止一个值,而是包含特定元素的列表,比如排除列表= ['3','5','6']。现在应该排除包含这些字符串的列表“l”的所有元素。我们该如何实现? - EnigmAI

12
如果我理解正确,

示例:

l = ['1', '32', '523', '336']

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

# Returns: ['1', '336']

fString示例:

l = ['1', '32', '523', '336']

stringVal = "2"

print(f"{[x for x in l if stringVal not in x]}")

# Returns: ['1', '336']

可能能够完成任务。


5

除了@Matth之外,如果您想组合多个语句,可以写成:

l = ['1', '32', '523', '336']

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

# Returns: ['1']

fString示例

l = ['1', '32', '523', '336']

stringValA = "2"
stringValB = "3"

print(f"{[ x for x in l if stringValA not in x and stringValB not in x ]}")

# Returns: ['1']

1
你可能遇到的问题是,在 for 循环中遍历序列 l 的同时尝试修改它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接