【问题标题】:list.append in python 3: nonetype is not iterable?python 3中的list.append:nonetype不可迭代?
【发布时间】:2017-07-05 04:18:37
【问题描述】:

我正在尝试将romeo.txt 中的每个单词添加到一个空列表中。
我认为这段代码没问题,但 python3 返回一个回溯说

文件“test.py”,第 13 行,在 中 如果我在 lst: TypeError:“NoneType”类型的参数不可迭代

这是我的代码:

fh = open("romeo.txt")
lst = list()
words = fh.read()
list1 = words.split()
for i in list1:
    if i in lst:
        continue
    else:
        lst = lst.append(i)
lst = lst.sort()
print(lst)

【问题讨论】:

  • 您知道可以使用set 来避免检查重复项吗? sorted(list(set(words.split())))
  • @ChristianDean 他没有,因为他在最后排序......
  • 而“他”是一个“她”:)
  • 您应该考虑接受有助于解决您的问题的答案。将答案表示为已接受有助于未来的读者在碰巧遇到相同问题时快速了解什么有助于解决您的问题。
  • 大家好,非常感谢您回答我的问题。几个月前我提出了这个问题,这是我第一次使用这个论坛。很抱歉我忘记了这个问题,因为我不是论坛的常客。我想在这里为我的无知道歉,谢谢大家。您的回答非常有帮助。

标签: python


【解决方案1】:

说明

你犯了两次同样的错误。您首先出现此错误以及您收到当前错误的原因是因为:

lst = lst.append(i)

append 方法实际上执行了 append。该调用的实际返回将是None,因为它不返回任何内容。它不需要,因为它完成了列表中的工作。

所以,要缩小确切的范围。当你做了lst = lst.append(i)lst 现在将持有 None。所以,下次它通过它的循环时,你会到达这里:

if i in lst:

您正在检查i 是否在None 中。因为现在lst 将保持None,正是在这里你的错误信息被提出,你会看到Traceback

复制:

   >>> 'a' in None
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument of type 'NoneType' is not iterable

解决方案

要解决这个问题,你只需要像这样执行追加:

lst.append(i)

第二个错误

你在这里调用sort时也犯了同样的错误:

lst = lst.sort()

这又是一种就地执行其工作的方法,因此您只需要:

lst.sort()

补充说明

不要忘记在代码末尾关闭文件(或者在使用完文件后:

fh.close()

理想情况下,最好使用上下文管理器,如另一个答案 here 中所述。由于上下文管理器为您完成所有“清理”工作。

【讨论】:

  • 没有人。我只是在开玩笑。我喜欢你的回答。这就是为什么我是第一个投票赞成它的人。我只是在逗你,因为你比我回答问题。
【解决方案2】:

你的问题是这一行:

lst = lst.append(i)

list.append() 不返回新列表,它在原地工作并返回 None。这意味着您只是将lst 分配给None。因此,当您尝试在下一次迭代中使用 lst 时,它会失败。只需删除分配给list.append()

lst.append(i)

请注意,您在这里也犯了同样的错误:

lst = lst.sort()

list.sort()就地工作。删除作业。


您的代码还可以通过多种方式改进:

  • 使用上下文管理器打开您的文件。这可确保您的文件始终关闭。

  • 由于您似乎在过滤列表中的重复项,因此您可以改用集合来删除重复项,然后按照 @Julien 的建议对剩余的单词进行排序。

以下是新代码的外观:

with open('romeo.txt', 'r') as file:
    words = set(file.read().split())
    lst = sorted(words)

print(lst)

【讨论】:

  • 您在调用.split() 之前忘记添加file.read()
  • @idjaw 谢谢。固定。
  • 使用pathlib 模块,这将折叠为:lst = sorted(set(pathlib.Path('romeo.txt').read_text().split()))
【解决方案3】:

如果你想避免循环,你可以使用集合:

fh = open("romeo.txt")
words = fh.read()
lst = list(set(words.split()))
lst.sort()
print(lst)

简单地说,一个集合不能有重复。

【讨论】:

  • 就像你忘记关闭文件的 OP。更好的建议是使用上下文管理器with open(...) as fh
【解决方案4】:

你好 Maxine Mou,

Python 3 学习最佳网站,
1.https://www.tutorialspoint.com/python3/
2.https://docs.python.org/3/tutorial/
3.https://learnpythonthehardway.org/python3/

python 2 和 python 3 的区别,
1.http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html
2.https://www.quora.com/What-are-the-major-differences-between-Python-2-and-Python-3

close() 方法
文件对象的 close() 方法会刷新所有未写入的信息并关闭文件对象,之后就不能再进行写入了。

当一个文件的引用对象被重新分配给另一个文件时,Python 会自动关闭一个文件。最好使用 close() 方法关闭文件。

语法

fileObject.close();

你的错误
当您在下面编写函数时,这是不正确的方法,因为 python 被理解为可迭代对象,所以您会收到错误,所以只写 lst.append(i)

lst = lst.append(i)

第二个错误与第一个相同。如果您使用 sort() 函数对列表进行排序,则不需要存储在任何变量中,因为 Python 正在对现有列表进行排序。所以只写lst.sort()

lst = lst.sort()

试试下面的代码,

    #Open File using open() file function
    fh = open("test.txt")
    lst = list() 
    words = fh.read()
    list1 = words.split()

    for item in list1: 
        if item in lst:
            continue
        else:
            lst.append(item)

    #List sorting using sort() function
    lst.sort()

    #Display the sorting list
    print(lst)

    # Close the file using close() method
    fh.close()

希望我的回答对你有所帮助。如有任何疑问,请发表评论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 2018-04-30
    • 2016-02-08
    • 2014-04-04
    • 2020-03-19
    • 2014-04-26
    • 1970-01-01
    相关资源
    最近更新 更多