2016-12-18 2 views
2

각 파일에는 학생들이 들어있는 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) 

다른 파일의 키와 값을 파이썬에서 함께 추가 할 수있는 방법이 있습니까?

답변

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() 
+0

고마워! 이것은 매우 도움이되었다 :) – cupcake93

0
어쩌면

하지 최고의 솔루션,하지만 (두 파일에서 쌍 목록 scores에 있다고 가정) 시도 :

from collections import defaultdict 

d = defaultdict(int) 
for s in scores: 
    d[s[0]] += s[1] 

print d 
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을 사용하여 모든 것을 단순화했습니다. 또한 itemgetterlambda으로 바 꾸었습니다. 다만 습관에 불과합니다. 마지막으로 file을 이 내장형이기 때문에 file_name으로 변경했습니다.

+1

좋아요! 그게 작동하는 것 같습니다 :) – cupcake93

0

사전을 사용하여 파일을 구문 분석 할 때 각 키에 해당하는 점수를 합산하면 작동합니다. 튜플의 각 요소 사이의 쉼표 뒤에 공백없이 - (A,3) (B,4) (C,1) (D,2) (E,6) (F,1)이 같은 것을보십시오 :

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(' ') 같은 공백 문자를 분할 할 경우, 파일이 같은 데이터를 포함한다 .