【问题标题】:open .txt file and place every word within a dictionary [closed]打开.txt文件并将每个单词放在字典中[关闭]
【发布时间】:2016-06-28 17:58:19
【问题描述】:

我希望打开一个.txt 文件并将文件中的所有单词输入dictionary。在我想累积字典中的单词总数之后。

.txt 文件包含 5 行:

elephant calculator fish
towel onion fish
nandos pigeon tiger
cheeky peg lion
dog cat fish

这是我目前拥有的:

words = 0 
dictionary = []
with open('file.txt','r') as file:
    for x in inf:
        dictionary.split(x)
        words += 1
print(words)

对于这个结构糟糕的问题,我们深表歉意。

【问题讨论】:

  • 抱歉,这不是生成代码的服务。到目前为止你做了什么?
  • 哦,新手,很快每个人都用被动攻击性的 cmets 击败他们,这样他们就学会了不再问!最好不要提供支持性和建设性的反馈,这在我们这些软件之神之下。
  • 您需要尽最大努力解决问题,然后我们才能使用该代码。这给了我们具体的代码相关问题。
  • @zondo 我已经用我目前拥有的内容编辑了这个问题,将来我会提供更多信息
  • 是的代码,这就是我们需要的。您创建了一个列表而不是字典,但这很好,因为您想要一个列表。

标签: python dictionary import


【解决方案1】:

获取唯一字数的简单方法是使用set。我将您的文本放入名为“qdata.txt”的文件中。

该文件非常小,因此无需逐行读取:只需将整个内容读入一个字符串,然后将该字符串拆分为空格并将结果列表传递给set 构造函数:

fname = 'qdata.txt'
with open(fname) as f:
    words = set(f.read().split())
print(words, len(words))

输出

set(['towel', 'onion', 'nandos', 'calculator', 'pigeon', 'dog', 'cat', 'tiger', 'lion', 'cheeky', 'elephant', 'peg', 'fish']) 13

之所以有效,是因为“集合对象是不同的可散列对象的无序集合”。如果您尝试将重复的项目添加到集合中,它会被忽略。请参阅文档了解更多详情。


对于较大的文件,最好逐行读取和处理它们以避免将整个文件加载到 RAM 中,但是对于现代操作系统,文件需要相当大才能看到任何好处,由于文件缓存。

fname = 'qdata.txt'
words = set()
with open(fname) as f:
    for line in f:
        words.update(line.split())

print(words, len(words))

【讨论】:

    【解决方案2】:

    你有几个问题,但基本策略是正确的

    • dictionary 实际上是一个列表……这就是你想要的。重命名它。
    • 您以file 打开文件,这在Python 3 中很好,但在Python 2 中不受欢迎,因为它掩盖了内置的file 对象。人们仍然对此很敏感,因此最好使用不同的名称。
    • 您没有使用文件变量,而是发明了一个名为 inf 的东西。
    • 你拆分了错误的东西。您想拆分从文件中读取的x 行。
    • 无需数单词....列表知道它们有多长。

    所以,这样会更好

    words = []
    with open('file.txt') as fileobj:
        for x in fileobj:
            words += x.strip().split()
    print(len(words))
    

    collections.Counter 通常用于统计单词的出现次数。假设您可以使用标准库中的任何内容,这将起作用(注意我小写,以便大象和大象计数相同):

    import collections
    words = collections.Counter(int)
    with open('file.txt') as fileobj:
        for x in fileobj:
            words.update(word.lower() for word in x.strip().split())
    # words is a dict-like object with a count of each word
    print(len(words))
    print(words)
    # lets pick one
    print('elephant count', words['elephant'])
    

    【讨论】:

    • 谢谢,您将如何修改它以使重复的单词不包括在总数中?例如“鱼”、“鱼”、“牛”字数 = 2
    • 已更新以计算字数。
    【解决方案3】:

    这可能效率低下,并且从未在这样的情况下使用过,但是作为我也是新手,我想知道为什么以下内容不能用于删除重复项。

    words = []
    with open('file.txt') as fileobj:
        for x in fileobj:
            words += x.strip().split()
        for i in words:
            if words.count(i) > 1:
                words.remove(i)
    print (len(words))
    print (words)
    

    大部分代码都归功于 tdelaney。

    【讨论】:

    • 从您正在迭代的列表中删除项目是很危险的。这有点像锯掉你坐着的树枝。见Remove items from a list while iterating in Python。此外,.count 效率不高:它必须在每次调用时对整个列表执行线性扫描。
    • 是的,我对从正在迭代的列表中删除项目有点犹豫。其余的也很有意义。非常感谢解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    相关资源
    最近更新 更多