对于蒂尔堡大学的班级数据结构和算法,我在课堂测试中得到了一个问题:
从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;
答案 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))