Python如何从文本文件构建字典?

2021-06-13 12:32:51 发布

您现在位置:Python中文网/ 问答频道 /正文

关于蒂尔堡大学的课堂数据结构和算法,我在课堂测试中遇到了一个问题:

从中建立词典testfile.txt文件,只有唯一的值,如果值再次出现,则应将其添加到该productclass的总和中。 文本文件如下所示,不是.csv文件:

apples,1
pears,15
oranges,777
apples,-4
oranges,222
pears,1
bananas,3

所以苹果是-3,输出是{"apples": -3, "oranges": 999...} 在考试中,除了正常的pcinput、math等外,我不允许导入任何外部软件包。我也不允许使用互联网。 我不知道如何做到这一点,这似乎是我发展python技能的一个大问题,因为这是一个在youtube上的“python词典”视频中没有给出的问题(可能会很难),但在专家课程中也没有给出,因为这个问题会很简单。你知道吗

希望你们能帮忙!你知道吗

enter code here
from collections import Counter
from sys import exit
from os.path import exists, isfile
##i did not finish it, but wat i wanted to achieve was build a list of the 
strings and their belonging integers. then use the counter method to add 
them together
## by splitting the string by marking the comma as the split point. 

filename = input("filename voor input: ")
if not isfile(filename):
    print(filename, "bestaat niet")
    exit()

keys = []
values = []
with open(filename) as f:
xs = f.read().split()
    for i in xs:
        keys.append([i])
print(keys)
my_dict = {}

for i in range(len(xs)):
    my_dict[xs[i]] = xs.count(xs[i])
print(my_dict)
word_and_integers_dict = dict(zip(keys, values))
print(word_and_integers_dict)

values2 = my_dict.split(",")
    for j in values2:
        print( value2 )

输出如下:

[['schijndel,-3'], ['amsterdam,0'], ['tokyo,5'], ['tilburg,777'], ['zaandam,5']]
{'zaandam,5': 1, 'tilburg,777': 1, 'amsterdam,0': 1, 'tokyo,5': 1, 'schijndel,-3': 1}
{}

所以我从中得到了字典,但是我没有把值分开。 错误消息如下:

 28 values2 = my_dict.split(",") <-- here was the error
 29 for j in values2:
 30     print( value2 )

AttributeError:“dict”对象没有属性“split”

2条回答
网友
1楼 ·

我不明白你的代码实际上在做什么,我认为你不知道你的变量包含什么,但是这是一个用Python很容易解决的问题。拆分为一个列表,再次拆分每个项目,然后计数:

>>> input = "apples,1 pears,15 oranges,777 apples,-4 oranges,222 pears,1 bananas,3"
>>> parts = input.split()
>>> parts
['apples,1', 'pears,15', 'oranges,777', 'apples,-4', 'oranges,222', 'pears,1', 'bananas,3']

然后又分手了。请看列表。在python中,这是一种将列表转换为另一个列表的惯用方法。请注意,数字是字符串,而不是整数。你知道吗

>>> strings = [s.split(',') for s in strings]
>>> strings
[['apples', '1'], ['pears', '15'], ['oranges', '777'], ['apples', '-4'], ['oranges', '222'], ['pears', '1'], ['bananas', '3']]

现在你要迭代成对的结果,求所有相同的结果的和。这需要口述:

>>> result = {}
>>> for fruit, countstr in pairs:
...     if fruit not in result:
...         result[fruit] = 0
...     result[fruit] += int(countstr)
>>> result
{'pears': 16, 'apples': -3, 'oranges': 999, 'bananas': 3}

这种在元素不存在时添加元素的模式经常出现。您应该在collections模块中签出defaultdict。如果你用它,你甚至不需要if。你知道吗

网友
2楼 ·

让我们来看看你需要做些什么。首先,检查文件是否存在,并将内容读取到变量中。第二,分析每一行-你需要把逗号上的行分开,把数字从字符串转换成整数,然后把值传递给字典。在本例中,我建议使用集合中的defaultdict,但我们也可以使用标准字典。你知道吗

from os.path import exists, isfile
from collections import defaultdict

filename = input("filename voor input: ")
if not isfile(filename):
    print(filename, "bestaat niet")
    exit()

# this reads the file to a list, removing newline characters
with open(filename) as f:
    line_list = [x.strip() for x in f]

# create a dictionary
my_dict = {}

# update the value in the dictionary if it already exists,
# otherwise add it to the dictionary
for line in line_list:
    k, v_str = line.split(',')
    if k in my_dict:
        my_dict[k] += int(v_str)
    else:
        my_dict[k] = int(v_str)

# print the dictionary
table_str = '{:<30}{}'
print(table_str.format('Item','Count'))
print('='*35)
for k,v in sorted(my_dict.item()):
    print(table_str.format(k,v))

相关问题