【问题标题】:List comprehension output is None [duplicate]列表理解输出为无 [重复]
【发布时间】:2016-04-06 12:40:13
【问题描述】:

我是 python 新手,我想尝试使用列表理解,但我得到的结果是 None。

print
wordlist = ['cat', 'dog', 'rabbit']
letterlist = []
letterlist = [letterlist.append(letter) for word in wordlist for letter in word if letter not in letterlist]
print letterlist

# output i get: [None, None, None, None, None, None, None, None, None]
# expected output: ['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i']

这是为什么呢?似乎它以某种方式起作用,因为我得到了预期数量的结果(9),但它们都是无。

【问题讨论】:

    标签: python list python-2.7 list-comprehension


    【解决方案1】:

    list.append(element) 不返回任何内容——它会将一个元素原地附加到列表中。

    你的代码可以改写为:

    wordlist = ['cat', 'dog', 'rabbit']
    letterlist = [letter for word in wordlist for letter in word]
    letterlist = list(set(letterlist))
    print letterlist
    

    ...如果您真的想使用列表推导式,或者:

    wordlist = ['cat', 'dog', 'rabbit']
    letterset = set()
    for word in wordlist:
        letterset.update(word)
    print letterset
    

    ……这可以说是更清楚了。这两个都假设顺序无关紧要。如果是这样,您可以使用 OrderedDict:

    from collections import OrderedDict
    letterlist = list(OrderedDict.fromkeys("".join(wordlist)).keys())
    print letterlist
    

    【讨论】:

    • 非常感谢您的帮助。
    【解决方案2】:

    list.append 返回None。您需要调整列表推导中的表达式以返回字母。

    wordlist = ['cat', 'dog', 'rabbit']
    letterset = set()
    letterlist = [(letterset.add(letter), letter)[1]
                  for word in wordlist
                  for letter in word
                  if letter not in letterset]
    print letterlist
    

    【讨论】:

    • 可爱,但我讨厌列出有副作用的组合。不过,我想这比用一堆Nones 填充列表要好...
    【解决方案3】:

    如果顺序无关紧要,请执行以下操作:

     resultlist = list({i for word in wordlist for i in word})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2011-06-15
      • 2019-08-05
      • 2021-10-31
      相关资源
      最近更新 更多