Skip to main content
 首页 » 编程设计

python之不从列表中删除

2025年05月04日18yyy_WW

我正在处理下一个代码:

for u in G: 
    if u.count('L')>1: 
        while (u in G)==True: 
            G.remove(u) 
print G 

其中 G 是包含字母 O、A 和 L 的字符串列表。 问题是,当 u.count('L') 大于 1 时,对象 u 不会从列表中消失。我该如何修复?谢谢。

[编辑] 我正在使用的列表示例如下:https://www.dropbox.com/s/qiv2jq4xlg0d5sg/list.txt

请您参考如下方法:

您似乎在尝试删除其中包含多个连续“L”的单词。

输入:['ALL', 'APPLE', 'LLAMA', 'LAX', 'PALLOR']

输出:['APPLE', 'LAX']

这里有一些方法:

列表理解

lyst[:] = [word for word in lyst if 'LL' not in word] 

([:] 部分表示 to put the new list in the same place the old one was 。对于小型列表来说这不是很重要,但会让您看起来知道自己在做什么。)

过滤器

lyst = filter(lambda word: 'LL' not in word, lyst) 

(您可以在 Python 2 中使用 filter 再次执行 [:] 技巧,但在 Python 3 中 filter 不会返回列表,所以我把它遗漏了。)

For循环

如何不这样做:

for i, word in enumerate(lyst): 
  if 'LL' in word: 
    del lyst[i] 

为什么不呢?它似乎适用于上面的列表,但请查看正在修改的索引:

>>> lyst = ['ALL', 'APPLE', 'LLAMA', 'LAX', 'PALLOR'] 
>>> for i,w in enumerate(lyst): 
...   print i,w 
...   if 'LL' in w: 
...     del lyst[i] 
...  
0 ALL 
1 LLAMA 
2 PALLOR 

这样不好! “LLAMA”的索引不是从 1 开始的。我们可以通过更改输入列表来破解此算法:

>>> lyst=['APPLE', 'ALL', 'LLAMA', 'LAX', 'PALLOR'] 
>>> for i,w in enumerate(lyst): 
...   print i,w 
...   if 'LL' in w:  
...     del lyst[i] 
...  
0 APPLE 
1 ALL 
2 LAX 
3 PALLOR 
>>> lyst 
['APPLE', 'LLAMA', 'LAX'] 

列表理解或过滤方法可能是最好的,但如果你真的喜欢写出你的循环,你必须反过来以避免索引从你下面改变:

>>> for i, w in reversed(list(enumerate(lyst))): 
...   print i,w 
...   if 'LL' in w: 
...     del lyst[i] 
...  
4 PALLOR 
3 LAX 
2 LLAMA 
1 ALL 
0 APPLE 
>>> lyst 
['APPLE', 'LAX']