【问题标题】:Iterating Through Python List Getting TypeError: 'NoneType' object is not iterable遍历 Python 列表获取 TypeError:'NoneType' 对象不可迭代
【发布时间】:2021-04-25 03:58:21
【问题描述】:

使用 nltk 根据输入的关键字列表生成同义词列表。

当 nltk 没有同义词时(即返回“None”时),我收到“TypeError: 'NoneType' object is not iterable”。

from nltk.corpus import stopwords
from PyDictionary import PyDictionary
dictionary=PyDictionary()


inputWords = ['word1','word2','word3','word4','word5','word6','word7','word8']

synonyms = list(dictionary.synonym(i) for i in inputWords 

同义词的当前输出:

[['syn1','syn2','syn3'],['syn4'],None,['syn5'],None,['syn6','syn7'],None,['syn8'],None]]

同义词的期望输出:

['syn1','syn2','syn3','syn4','syn5','syn6','syn7','syn8']

我试过了:

flat_list = [item for sublist in synonyms for item in sublist]

输出:

TypeError: 'NoneType' object is not iterable

我应该写什么来只返回一个干净列表中的同义词?我更喜欢使用列表理解。 任何帮助表示赞赏。我是python菜鸟,找不到确切的答案。

【问题讨论】:

    标签: python list loops nltk list-comprehension


    【解决方案1】:

    您可以删除 None 值并使用 itertools -

    import itertools
    list(itertools.chain(*[x for x in synonyms if x]))
    

    【讨论】:

    • 不妨使用list(itertools.chain.from_iterable(filter(None, synonyms)))
    【解决方案2】:

    这是一个更 Pythonic 的单行:

    flat_list = [i for sublist in synonyms if sublist is not None for i in sublist]
    flat_list
    >>>
    ['syn1', 'syn2', 'syn3', 'syn4', 'syn5', 'syn6', 'syn7', 'syn8']
    
    

    【讨论】:

      【解决方案3】:

      试试:

      flat_list = []
      
      for i in range(len(synonyms):
         if isinstance(synonyms, list):
            flat_list += i
      

      【讨论】:

      • 你不应该使用它。那只是引用了内置的next函数,非常混乱。
      • 我在 10 秒前读到了它。但从未对我的脚本造成任何损害,但我只是做了一些 LSTM 或 RNN 工作。
      • 随意放置无意义的东西会损坏您的代码,因为它会让人感到困惑。
      • 不适合我,模型是供以后使用的,不是代码,但我明白你的意思。谢谢
      【解决方案4】:

      一个pythonic的方式来做到这一点:

      result = []
      for word in input_words:
          synonyms = dictionary.synonym(word)
          if synonyms:
              result.extend(synonyms)
      

      如果您坚持使用列表推导式,您可以使用赋值表达式:

      [synonym for word in input_words if (synonyms:=dictionary.synonym(words)) for synonym in synonyms]
      

      但我认为第一个选项更可取。

      【讨论】:

        猜你喜欢
        • 2014-02-08
        • 2017-08-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-25
        • 1970-01-01
        相关资源
        最近更新 更多