【问题标题】:Python Removing Words from list even if they match criteriaPython从列表中删除单词,即使它们符合条件
【发布时间】:2019-08-17 00:17:06
【问题描述】:

两天前我刚开始用 python 编程,我正在尝试创建一个简单的刽子手游戏,其中计算机使用包含大量英语单词(约 69.9k)的 .txt 文件来猜测单词,我是基本上是问用户一些问题并删除不必要的单词。 然而,即使它们符合条件,python 也会删除这些单词,我什至尝试在 listname.pop() 函数上使用 print,但缺少的单词不会出现在那里。

我已经尝试过检查我是否正确地将单词添加到单词列表中,这似乎是正确的,因为我直接从列表中打印出来,主文件除了打印内容和输入内容之外没有太多其他内容应该没有问题。

这是基本代码:

    from ReadFile import ReadFile

    w_list = ReadFile()
    n_list = []


    def RemoveExtraByRange(range_w):

        for x, words in enumerate(w_list):

            if len(words) != int(range_w):
                w_list.pop(x)
            else:
                n_list.append(w_list[x])


    def RemoveExtraByFLetter(f_letter):
        w_list.clear()

        for x, words in enumerate(n_list):

            if not words.startswith(f_letter):
                n_list.pop(x)
            else:
                w_list.append(n_list[x])


    def RemoveExtraByLLetter(l_letter):
        n_list.clear()

        for x, words in enumerate(w_list):
            if not words.endswith(l_letter):
                w_list.pop(x)
            else:
                n_list.append(words)

        w_list.clear()

编辑:将列表转换为集合(这无关紧要,因为每个单词都是唯一的)。还将 n 列表更改为仅包含不必要的单词,在每个函数的开头我清除 n_list。我也使用 w_list -= n_list 而不是 pop 。这为我修好了。

【问题讨论】:

  • 欢迎莫辛。你提到的txt文件只包含单词而不包含其他内容?能否请您发布一个小样本?
  • 您在多个地方正在修改一个列表,这可能会导致问题发生。
  • 是的,只是文字。每行一个字。这是列表:www-personal.umich.edu/~jlawler/wordlist
  • @ScottHunter 那么更简单的出路是什么?只需将我要删除的单词的索引放在后面并删除它们?

标签: python-3.x


【解决方案1】:

这是因为你在循环中使用了修改列表。 如果您通过枚举列表和弹出索引来更改列表。 让我们举个例子:

a = [1,2,3,4,5]
for i in range(3):
    a.pop(i)

然后a == [2,4]

我会先对集合进行操作(因为我猜单词列表是唯一的)

然后在循环中创建一个包含不满足需求的单词的集合并更改原始集合。

类似:

w_list = set()
n_list = set()

...

for word in w_list:
    if len(words) == int(range_w):
        n_list.add(word)
w_list -= n_list

【讨论】:

  • 哦,好吧,我不知道为什么我从来没有想过。使用 pop 会改变索引,这反过来会给我带来不想要的结果。如果我理解正确,我基本上必须在循环期间将不需要的单词存储在一个列表中,然后在循环之后从原始列表中删除这些单词。谢谢,如果可行,我会尝试并将其标记为正确
  • 嗯,所以我又试了一次,我有两个问题。我不能做 w_list -= n_list。我在循环结束后尝试了这个:for x in n_list: w_list.pop(x)。然而,就像我这会给我 indexoutofrange 异常错误。我还想提一下,我已经尝试过 listname.remove() 但我仍然遇到同样的问题(尽管我在循环中这样做了)。问题是如果是索引更改的问题,它不应该影响 remove() 因为它不使用索引而是搜索给定的对象。
  • “我做不到w_list -= n_list”——为什么不呢?如果失败,错误信息是什么?如果它产生了错误的结果,它是怎么错的?
  • @ScottHunter 我遇到了 TypeError 异常。 TypeError: unsupported operand type(s) for -=: 'list' and 'list'
  • 不能对列表进行加减运算。这就是为什么您应该将其更改为集合的原因。那么应该就OK了。
【解决方案2】:

这里的想法是收集要删除的索引,然后以相反的顺序进行:

def RemoveExtraByRange(range_w):
    to_go = []
    for x, words in enumerate(w_list):
        if len(words) != int(range_w):
            to_go.append( x )
        else:
            n_list.append(words)
    to_go.reverse()
    for x in to_go:
        w_list.pop(x)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2017-08-19
    • 2023-02-02
    • 1970-01-01
    • 2013-10-06
    相关资源
    最近更新 更多