我有11个文件,每个文件都包含学生,每个学生都有分数。像这样:
文件1: (A,3) (B,4) (C,1) (D,2) (E,6) (F,1)
文件2: (A,8) (B,3) (C,4) (D,2) 等,
我现在想制作一个计数器,它遍历所有11个文件并添加和排序所有键的值,这样我就会有这样的事情:
(A,11)(B,7)(E,6)(C,5)(D,4)(F,1)
我使用了以下代码,但是这个代码没有组合来自不同文件的值:
import os
import glob
from collections import defaultdict
from operator import itemgetter
for file in list(glob.glob('*.txt')):
scores = []
with open(file) as f:
for line in f:
name, score = line.split(' ')
score = int(score)
scores.append((name, score))
##this is the part where it is all about:
dict_1 = dict(scores)
all_keys = []
all_keys += set(dict_1.keys())
sum_list = [(k, dict_1.get(k, 0)) for k in all_keys]
print sorted(sum_list, key=itemgetter(1), reverse=True)
有没有办法可以在Python中将不同文件中的键和值添加到一起?
答案 0 :(得分:1)
您应该使用collections.Counter。它将处理数据组合,并允许您方便地从最高值到最低值进行排序。另外,我认为你的文件阅读块有轻微的缩进问题。
import glob
from collections import Counter
counter = Counter()
for filename in glob.glob('*.txt'):
with open(filename) as file:
for line in file:
name, score = line.split(' ')
counter[name] += int(score)
print counter.most_common()
答案 1 :(得分:0)
也许不是最好的解决方案,但试试这个(假设两个文件中的对都在列表scores
中):
from collections import defaultdict
d = defaultdict(int)
for s in scores:
d[s[0]] += s[1]
print d
答案 2 :(得分:0)
也许这样做:
cuda8.0
我修复了缩进并使用您已导入的import os
import glob
from collections import defaultdict
score_sums = defaultdict(int)
for file_name in list(glob.glob('*.txt')):
with open(file_name, 'r') as f:
for line in f:
name, score = line.split(' ')
score = int(score)
score_sums[name] += score
print sorted(score_sums, key=lambda k:score_sums[k], reverse=True)
简化了整个过程。我还用defaultdict
替换了您的itemgetter
,但这只是习惯问题。最后,我将lambda
更改为file
,因为file_name
是内置类型。
答案 3 :(得分:0)
使用字典并在解析文件时对与每个键对应的分数求和将起作用。尝试这样的事情:
import os
import glob
from collections import defaultdict
from operator import itemgetter
scores = defaultdict(int)
for file in list(glob.glob('*.txt')):
with open(file) as f:
for line in f:
tuples = line.split(' ')
for elem in tuples:
name, score = tuple(elem[1:-1].split(','))
score = int(score)
scores[name] += score
print scores
另外,如果你想拆分像split(' ')
这样的空格字符,你的文件应该包含如下数据:
(A,3) (B,4) (C,1) (D,2) (E,6) (F,1)
- 元组的每个元素之间的逗号之后没有空格。