结合元组列表

时间:2016-12-18 18:05:34

标签: python tuples

我有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中将不同文件中的键和值添加到一起?

4 个答案:

答案 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) - 元组的每个元素之间的逗号之后没有空格。