不从列表中删除

时间:2013-12-31 20:54:52

标签: python string list

我正在使用下一个代码:

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

3 个答案:

答案 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 loop

如何不这样做:

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]