2 votes

combiner des listes de tuples

J'ai 11 fichiers, chacun d'entre eux contenant des étudiants, et des scores pour chaque étudiant. Comme ceci :

Fichier 1 : (A, 3) (B, 4) (C, 1) (D, 2) (E, 6) (F, 1)

Fichier 2 : (A, 8) (B, 3) (C, 4) (D, 2) etc,

Je veux maintenant faire un compteur qui itère sur les 11 fichiers et ajoute et trie la valeur pour toutes les clés, de sorte que j'obtienne quelque chose comme ceci :

(A, 11) (B, 7) (E, 6) (C, 5) (D, 4) (F, 1)

J'ai utilisé le code suivant, mais celui-ci ne combine pas les valeurs des différents fichiers :

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)

Existe-t-il un moyen d'ajouter les clés et les valeurs des différents fichiers ensemble en Python ?

1voto

lazy dog Points 1861

Vous devez utiliser collections.Counter pour ça. Il s'occupera de combiner les données et vous permettra de les trier commodément de la plus haute à la plus basse valeur. De plus, je pense que vous avez un léger problème d'indentation dans votre bloc de lecture de fichiers.

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

0voto

elethan Points 6867

Ce n'est peut-être pas la meilleure solution, mais essayez ceci (en supposant que les paires des deux fichiers sont dans une liste) scores ):

from collections import defaultdict

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

print d

0voto

jDo Points 3289

Peut-être que ça fera l'affaire :

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)

J'ai corrigé l'indentation et simplifié un peu le tout en utilisant une defaultdict que vous étiez déjà en train d'importer. J'ai également remplacé votre itemgetter avec un lambda mais c'est juste une question d'habitude. Finalement, j'ai changé file à file_name depuis file est un type intégré.

0voto

sacha-cs Points 71

L'utilisation d'un dictionnaire et la sommation du score correspondant à chaque clé au fur et à mesure de l'analyse des fichiers pourraient fonctionner. Essayez quelque chose comme ceci :

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

De plus, si vous voulez diviser sur le caractère d'espace comme split(' ') vos fichiers devraient contenir les données comme ceci : (A,3) (B,4) (C,1) (D,2) (E,6) (F,1) - sans espace après la virgule entre chaque élément du tuple.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X