7
votes

Fonction zippée Aide avec les tuples

J'espère que quelqu'un peut m'aider avec un problème que je suis coincé avec. J'ai un grand nombre de tuples (> 500) qui ressemblent à ceci: xxx

un extrait de mon code lit: xxx

i Réalisez que le code ci-dessus n'est pas correct. J'essaie de trouver un moyen d'ajouter toutes les valeurs A ensemble, toutes les valeurs de B ensemble, toutes les valeurs de C ensemble et toutes les valeurs de D ensemble à l'aide de la fonction ZIP. Par exemple, j'aimerais imprimer quelque chose qui ressemble à ceci: xxx

peut-on aider s'il vous plaît? Merci beaucoup pour votre temps.


0 commentaires

5 Réponses :


15
votes
>>> myTuples = [(1,2,3), (10,20,30), (100,200,300)]
>>> [sum(x) for x in zip(*myTuples)]
[111, 222, 333]

7 commentaires

ITERTOOLS.IFP est probablement mieux adapté aux listes plus longues.


Quand je fermeture zip ((1,2,3), (10 20h30), (100 200 300)) Je ne reçois pas [(1, 10, 100), (2, 20, 200), (3, 30 , 300)]. Je reçois . Une idée de ce qui va mal?


Il y a une différence dans la façon dont Python2 poignées zip par rapport à Python3. Je ne suis pas sûr de savoir pourquoi à Python3 le zip ci-dessus ne fonctionne pas? Aucune suggestion?


Ça marche très bien; L'objet zip renvoie un objet itérable (tout comme la plage est ou une fonction génératrice initialisée). C'est généralement une bonne chose, car vous n'avez pas à calculer chaque valeur lorsque vous l'initialisez («paresseux est préférable»). Vous pouvez toujours convertir explicitement une telle ierérable à une liste, comme: liste (zip (((1,2), (3,4))), forçant l'évaluation alors et là. J'ai ajouté une note à ce sujet dans la question, merci.


@ninjagecko Pourriez-vous me signaler dans la bonne direction pour obtenir la photo du * dans * myTeuples ?


@LERNERADAMS: Par "Obtenez la photo" Voulez-vous dire comprendre? C'est la syntaxe de prendre une liste et de «l'appliquer» comme des arguments à une fonction. Donc f (* [1,2,3]) signifie f (1,2,3) . Il y a une variante pour les arguments de mots clés: f (** dict (x = 1, y = 2)) signifie f (x = 1, y = 2) . Voir Stackoverflow.com/questions/3394835/args-and-kwargs et Stackoverflow.com/questions / 36901 / ...


@ninjagecko ouais, je voulais comprendre. Merci. J'avais lu le document officiel qui se lit "avec l'opérateur * peut être utilisé pour décompresser une liste" mais je suis resté confus. Merci beaucoup.



2
votes

Ce que vos ensembles sont tous de la même taille et que vous travaillez dans C Python, vous devez envisager d'utiliser Numpy . Vous pouvez le faire dans NUMPY LIEU SO:

Excluding numpy Array Conversion: 0.0735958760122
Including numpy Array Conversion: 17.1435046214
Plain old zip: 0.660146750495


2 commentaires

Je soupçonne que les frais généraux de Numpy seraient très grands ici, à moins que vous ne traitez de milliers d'articles.


J'ajouterai un exemple "Timeiting" dans une seconde.



4
votes
map(sum, zip(a, b, c, d, e))
The first call, to zip, inverts the lists - makes a list of all first elements, all second elements, etc.The second call, map, calls its first argument sum on its second argument, those lists, returning a list of the results of sum - which happens to be the sums.

2 commentaires

Merci, je pense que c'est ce dont j'ai besoin. Je suis toujours juste un peu confus cependant. Zip (A, B, C, D, E) ... pas sûr de ce que "E" est? N'y a-t-il que quatre chiffres dans chaque tuple (A, B, C, D)? Quand j'exécute cela dans mon script, je reçois un 'TypeError: Zip Argument # 1 doit supporter l'itération.' Des idées? J'ai édité mon post original pour refléter ce que j'ai fait.


A, B, C, D et E sont les tuples que vous avez énumérés. Chacun est un tuple de quatre éléments.



0
votes

Si vous avez tous ces tuples dans une liste, vous pouvez utiliser Réduire () : xxx


0 commentaires

0
votes
tuples  = [(2,1,3,6), (1,2,5,5),  (3,0,1,6), (10,1,1,4), (0,3,3,0)]
s = [sum(tup) for tup in zip(*tuples)]
Asum, Bsum, Csum, Dsum = s

0 commentaires