我正在使用下一个代码:
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
答案 0 :(得分:4)
您似乎试图删除其中包含多个连续“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 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']
答案 1 :(得分:2)
使用Python中的for
循环迭代它时,无法从列表中删除元素。相反,尝试列表理解:
>>> G = ['ALL', 'ALM', 'AMM', 'ANM', 'LAL' ]
>>> # if you want to remove words with more than one 'L'
>>> H = [ u for u in G if u.count('L') <= 1 ]
>>> H
['ALM', 'AMM', 'ANM']
>>> # if you want to remove words with consecutive Ls, i.e. 'LL'
>>> H = [ u for u in G if 'LL' not in u ]
>>> H
['ALM', 'AMM', 'ANM', 'LAL']
已更新:我添加了一个演示如何删除包含连续Ls的单词,这似乎是OP尝试完成的最有可能的任务。
答案 2 :(得分:0)
如果要从列表中删除包含L的所有字符串,请执行
G = [s for s in G if 'L' not in s]