【问题标题】:How to delete item in list whilst iterating through list [duplicate]遍历列表时如何删除列表中的项目[重复]
【发布时间】:2021-01-04 16:15:33
【问题描述】:

我有一个单词列表,以及一个根据单词长度和单词中的字母搜索单词的函数。

最后的 for 循环遍历可能的单词列表(由给定的长度生成),如果它包含给定的字母,它应该打印该单词,或者如果它应该从可能的单词列表中删除该单词不包含给定的字母。

我怎样才能在这里做到这一点:

wlist = ['Apple', 'Banana', 'Cherry', 'Donkey']

def wordSearch(wlist):
    posWords = []
    length = int(input('Enter length of word: '))
    print("POSSIBLE WORD(S):")
    for word in wlist:
        stripWord = word.replace(' ', '')
        if len(stripWord) == length:
            print("%s (%s)" % (word, length))
            posWords.append(word)

    while True:
        searchOptions = ['Add Known Letter', 'Exit']
        searchIndex, item = chooseFromMenu(searchOptions)
        if searchIndex == 0:
            letter = input('Enter letter: ')
            print("POSSIBLE WORD(S):")
            for word in posWords:
                if letter in word:
                    print(word)
                else:
                    # remove word from list somehow
        else:
            break

特别是这个块:

letter = input('Enter letter: ')
print("POSSIBLE WORD(S):")
for word in posWords:
    if letter in word:
        print(word)
    else:
        # remove word from list somehow

我尝试过 del wordposWords.pop(word) 但似乎都不起作用。

我也尝试过.remove(),但我记不起我做了什么。

我将详细介绍我在这里遇到的问题...

如果我输入字母“e”,它应该从可能的单词列表中删除“香蕉”,这样当我输入“n”时,我应该只得到“驴”,而不是“驴”和“香蕉”。

如果有道理的话。

我刚刚尝试了posWords.remove(word),它也没有这样做...

【问题讨论】:

  • 这能回答你的问题吗? How to remove items from a list while iterating?
  • 很遗憾没有。在我决定自己写之前,我看到了那篇文章。解决方案没有解决我的问题。
  • 为什么这些解决方案不起作用?
  • 为什么在迭代时必须删除它们?分两步完成:打印所有匹配的单词,然后删除所有不匹配的单词。
  • “如何在遍历列表时删除列表中的项目?”的答案是。想一个不同的方式来实现你的目标。

标签: python python-3.x list loops


【解决方案1】:

您可以反向迭代列表,这样删除一个元素不会影响其余的迭代。

for i in range(len(posWords)-1, -1, -1):
    if letter in posWords[i]:
        print(posWords[i])
    else:
        posWords.pop(i)

这是this answer 中针对您所说的问题没有解决您的问题的解决方案。

注意pop() 的参数是列表索引,而不是列表元素。

【讨论】:

  • 也许我们应该结合我们的答案,因为它们指向了双向迭代的两种方式
  • 他们已经足够不同了
【解决方案2】:

您可以使用 while 循环并仅在没有删除任何项目时增加迭代器。

i = 0
while i < len(posWords):
    if letter in word:
        print(word)
        i += 1
    else:
        del posWords[i] # posWords.pop(i) does the same

这是可行的,因为如果删除了一个项目,下一个项目的索引会减 1,所以我现在指向下一个项目

【讨论】:

【解决方案3】:

如果我正确理解了您的问题,那么以下应该有效:

letter = input('Enter letter: ')
print("POSSIBLE WORD(S):")
for word in posWords[:]:
    if letter in word:
        print(word)
    else:
        posWords.remove(word)

【讨论】:

  • 最后一行应该是posWords.remove(word)
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 2015-07-12
  • 2013-10-15
  • 1970-01-01
  • 2020-01-07
  • 2010-11-24
  • 2011-09-09
相关资源
最近更新 更多