Python:类型' NoneType'的参数不可迭代

时间:2016-01-02 14:32:10

标签: python list sorting iterable nonetype

我想建立一个单词列表。对于每行上的每个单词,检查该单词是否已经在列表中,如果没有将其附加到列表中。程序完成后,按字母顺序对生成的单词进行排序和打印。 但是当我在列表中添加一个字符串时,它会显示"类型' NoneType'是不可迭代的#34;。什么'担心?

    fh = ("But soft what light through yonder window breaks"
    "It is the east and Juliet is the sun"
    "Arise fair sun and kill the envious moon"
    "Who is already sick and pale with grief")
    lst = list()
    for line in fh:
        words = line.split()
        for word in line:
                if word not in lst:
                    lst = lst.append(word)
    lst.sort()
    print lst

3 个答案:

答案 0 :(得分:2)

当你将两个字符串文字放在一起时,你得到一个字符串:

>>> 'hi' 'there'
'hithere'

它们之间的空白不会影响这一点。这意味着for line in fh:正在迭代每个字符,而不是每一行,从而产生意外结果。你有几个选择来解决这个问题。

使用三引号字符串和splitlines()

fh = ("""But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief""")
fh = fh.splitlines()

结果:

>>> fh[0]
'But soft what light through yonder window breaks'

或使用listtuple

fh = ("But soft what light through yonder window breaks",
"It is the east and Juliet is the sun",
"Arise fair sun and kill the envious moon",
"Who is already sick and pale with grief")

结果:

>>> fh[0]
'But soft what light through yonder window breaks'

然后你split()行并保存,但你忘了使用它。 for word in line:for word in words:来迭代新对象。或者,您可以保持该行相同,而是将其上方的行(words = line.split())更改为line = line.split()

然后还有一个问题:append()就地操作并返回None。这意味着您只需调用该方法即可完成它所说的内容,而无需重新分配引用。如果你这样做,lst会很快指向None,你不希望这样。这样做:

lst.append(word)

答案 1 :(得分:1)

好吧,fh是一个单独的字符串,而python不知道如何按照你想要的行划分它。您应该尝试添加逗号(或三引号,即"""):

fh = ("But soft what light through yonder window breaks",
    "It is the east and Juliet is the sun",
    "Arise fair sun and kill the envious moon",
    "Who is already sick and pale with grief")

这将使您获得:

>>> fh
('But soft what light through yonder window breaks', 
'It is the east and Juliet is the sun',
'Arise fair sun and kill the envious moon',
'Who is already sick and pale with grief')

执行此操作后,您可以正确使用for line in fh,然后您可能希望使用for word in words代替for word in line,这在这里没有多大意义。这将允许您迭代文本中每一行的所有单词。

此外,.append()返回None(它正在更改列表就地),因此在这种情况下将其分配给变量是无用的。因此,为了补救,您应该创建一个不同的列表并使用.append()

另外,一般来说lst = lst.append(word)没有任何意义(即使它“有效”),你想用这个做什么?

答案 2 :(得分:0)

我会尽力帮助你。

首先,问题的质量可能会更好。我认为您应该尝试为您的代码段提供一些理由,这样任何响应的人都可以通过改进您的解决方案,以及背后的思考(让您成为更好的编码器)来帮助您。

其次,这个问题已经通过网络上的许多好解释得到了解决。查看例如item frequency count in python有很多聪明的解决方案。

第三,这可能是您期望的部分,您的问题表明您需要提高对Python语法,功能和一般算法思维的理解。让我详细说明一下。

Python语法和功能

许多其他答案都强调了您使用fh的方式并不是很好。通常,您将在Python中使用这样的多行字符串:

fh = '''this is the first row
second row
third row'''

从更好地理解Python的语法和功能中获得的其他值得注意的例子是:列表理解,内置类型等。走过Python tutorial。深入了解它,非常有用!

算法思维

通常,当我看到像你这样的代码时,我会试着弄清楚问题是否缺乏对工具(在本例中为Python)或解决方案本身的理解/知识。在你的情况下,我认为这两者都是。

当涉及到解决方案时,许多有经验的程序员(或者至少在他们的职业生涯开始时做过)会弄清楚他们打算如何解决问题。一个典型的有经验的编码人员会检查他们的工具箱,看看它会起作用,然后应用它。

我会通过使用set使用set数据类型解决此问题来解决问题。在大多数情况下,集合非常方便,并且在离散数学领域中有很好的描述。看看罗森的书Discrete Mathematics and Its Applications,其中涵盖了这本以及将来会发现有用的其他一些东西。 (你可能会发现许多描述集合的在线资源,但那本书是 对离散数学领域的引用。我建议得到它。)

因为集合非常方便,Python自然会内置支持它。再次,Python教程拯救了,请查看sets上的部分。

可能的解决方案

那么,可能的解决方案是什么样的呢?我会做以下事情:

  1. 确保所有内容都在多行字符串中。
  2. 将字符串拆分为列表。
  3. 根据列表内容创建一个集合。
  4. 转换回列表,以便对其进行排序。
  5. 排序。
  6. 打印。
  7. 这些都不需要任何forif语句,并且使用了该语言的许多内置功能。<​​/ p>

    希望这个建议可以帮助你!