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

时间:2017-11-20 12:30:23

标签: python dictionary building

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

从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技能时的一个大问题,因为这是一个在python'中的词典中没有给出的问题。 youtube上的视频(可能很难),但也没有在专家课程中给出,因为这个问题很简单。

希望你们能帮忙!

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 )

属性错误:&#39; dict&#39;对象没有属性&#39; split&#39;

2 个答案:

答案 0 :(得分:0)

我不明白你的代码实际在做什么,我想你不知道你的变量包含什么,但这是一个很容易在Python中解决的问题。拆分成一个列表,再次拆分每个项目,并计算:

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

然后再分开。看看列表理解。这是在python中将列表转换为另一个列表的惯用方法。请注意,这些数字是字符串,而不是整数。

>>> 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}

现在你想迭代对,并总结所有相同的成果。这需要一个字典:

defaultdict

这种添加元素的模式如果不存在则经常出现。您应该在collections模块中结帐if。如果你使用它,你甚至不需要 RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.your_widget_layout); ... // Initialize listview here ... Intent refreshIntent = new Intent(context,YourWidgetProvider.class); refreshIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); PendingIntent refreshPendingIntent = PendingIntent.getBroadcast(context, REFRESH_PENDING_INTENT_ID, refreshIntent, PendingIntent.FLAG_UPDATE_CURRENT); rv.setOnClickPendingIntent(R.id.your_refresh_button_id, refreshPendingIntent);

答案 1 :(得分:0)

让我们来看看你需要做些什么。首先,检查文件是否存在并将内容读取到变量。其次,解析每一行 - 您需要在逗号上拆分行,将数字从字符串转换为整数,然后将值传递给字典。在这种情况下,我建议使用集合中的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))