关于python 3.x:从文件创建字典

Create a dictionary from a file

我正在创建一个允许用户输入自己选择的.txt文件的代码。例如,如果文本为:

"我就是你。你就是我。"

我希望我的代码创建一个类似于以下内容的字典:_i:2,am:1,you:2,are:1_

将文件中的单词显示为键,并将次数作为值。大小写应该不相关,所以are=are=are=are=etc…

这是迄今为止我的代码。有什么建议/帮助吗?

1
2
3
4
5
6
7
8
>> file = input("
 Please select a file")
>> name = open(file, 'r')    
>> dictionary = {}
>> with name:
     >> for line in name:
          >> (key, val) = line.split()
          >> dictionary[int(key)] = val

看看这个答案中的例子:

python:dict列表,如果存在,则递增dict值,如果不附加新dict

你可以使用collections.Counter()来做你想做的琐碎的事情,但是如果出于某种原因你不能使用它,你可以使用defaultdict甚至一个简单的循环来构建你想要的字典。

下面是解决您的问题的代码。这将在Python3.1和更新版本中工作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from collections import Counter
import string

def filter_punctuation(s):
    return ''.join(ch if ch not in string.punctuation else ' ' for ch in s)

def lower_case_words(f):
    for line in f:
        line = filter_punctuation(line)
        for word in line.split():
            yield word.lower()

def count_key(tup):
   """
    key function to make a count dictionary sort into descending order
    by count, then case-insensitive word order when counts are the same.
    tup must be a tuple in the form: (word, count)
   """
    word, count = tup
    return (-count, word.lower())

dictionary = {}

fname = input("
Please enter a file name:")
with open(fname,"rt") as f:
    dictionary = Counter(lower_case_words(f))

print(sorted(dictionary.items(), key=count_key))

从您的示例中,我可以看到您希望去掉标点符号。因为我们要在空白处拆分字符串,所以我编写了一个函数,它将标点符号过滤为空白。这样,如果你有一个像hello,world这样的字符串,当我们在空白处拆分时,它将被拆分为helloworld两个词。

函数lower_case_words()是一个生成器,它一次读取一行输入文件,然后从每行中一次生成一个字。这将我们的输入处理整齐地放入一个整洁的"黑匣子",稍后我们可以简单地调用Counter(lower_case_words(f)),它为我们做了正确的事情。

当然,你不必打印分类后的字典,但我认为这样看起来更好。我做了排序,把最高的计数放在第一位,在计数相等的地方,把单词按字母顺序排列。

根据您的建议输入,这是结果输出:

1
[('i', 2), ('you', 2), ('am', 1), ('are', 1)]

由于排序,它总是按上面的顺序打印。