【问题标题】:Why doesn't this list comprehension work? [duplicate]为什么这个列表理解不起作用? [复制]
【发布时间】:2016-09-30 15:03:32
【问题描述】:

代码的目的是收集wordlist中的所有字符,我做了以下:

wordlist = ['cat','dog','rabbit']
[c for c in word for word in wordlist]

输出很奇怪:

['r',
 'r',
 'r',
 'a',
 'a',
 'a',
 'b',
 'b',
 'b',
 'b',
 'b',
 'b',
 'i',
 'i',
 'i',
 't',
 't',
 't']

我知道我可以这样做:

[ch for ch in "".join(wordlist)]

[word[i] for word in wordlist for i in range(len(word))]

但是我的第一个建议似乎也正确,谁能告诉我为什么第一个不起作用?

【问题讨论】:

  • 你需要[c for word in wordlist for c in word]。它与循环形成的顺序以及它们是否嵌套有关。
  • [c for wordlist for c in word]
  • 我觉得这更具可读性:list("".join(wordlist))
  • 只有在运行之前设置了word = 'rabbit',您的代码才有效。否则,您问题中的代码会引发NameError 异常。

标签: python list


【解决方案1】:

问题在于理解中for 语句的顺序,它们必须交换:

In [10]: [c for word in wordlist for c in word]
Out[10]: ['c', 'a', 't', 'd', 'o', 'g', 'r', 'a', 'b', 'b', 'i', 't']

请注意,它对您有用并且没有因“word 未定义”错误而失败的原因是您在范围内将 word 变量定义为 rabbit

In [3]: [c for c in word for word in wordlist]
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-7-decfecd23a92> in <module>()
----> 1 [c for c in word for word in wordlist]

NameError: name 'word' is not defined
In [4]: word = 'rabbit'

In [5]: [c for c in word for word in wordlist]
Out[5]: 
['r',
 'r',
 'r',
 'a',
 'a',
 'a',
 'b',
 'b',
 'b',
 'b',
 'b',
 'b',
 'i',
 'i',
 'i',
 't',
 't',
 't']

【讨论】:

  • 但为什么输出看起来像这样?
  • 我明白了,第一个中的 w 是一个已定义的全局变量,而第二个循环中的 w 是一个局部变量。
【解决方案2】:

您的for 语句顺序错误:

[c for c in word for word in wordlist]

应该是

[c for word in wordlist for c in word]

记住for 语句在列表推导中的顺序的方法是想象您将如何将其编写为循环。顺序遵循缩进:

result = []
for word in wordlist:
    for c in word:
        result.append(c)

【讨论】:

    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 2017-02-17
    • 2017-07-07
    • 2011-03-10
    • 2016-01-13
    相关资源
    最近更新 更多