7
votes

Aplatir une liste en python

J'ai une liste comme celle-ci:

for item in list:
    reqs = reqs + item[1]
    b.append(item[0])
c = set(b)


4 commentaires

Avez-vous besoin du ... dans l'exemple liste? Ce serait un exemple de travail sans elle.


Que voulez-vous réellement atteindre à la fin? Un ensemble C de videox variables et la somme des autres numéros que vous avez énumérées?


@jamylak no, ...... signifie qu'il y a beaucoup de données plus similaires que je ne dois pas tous les énumérer


@Shep Oui, cette liste contient de nombreux données, pas seulement ceux que j'ai énumérés ici, mais essentiellement c'est ce que je veux faire


7 Réponses :


9
votes

Aplatigez un niveau, vous pouvez utiliser itheroTools.chain.from_iterable () : xxx


2 commentaires

@Marcin: Vous avez raison, c'est comme ça que cela a été appelé in numy. :)


Preuve, comme si la preuve était nécessaire, ce nombre est mauvais pour vous;)



9
votes

Si vous voulez simplement aplatir la liste, utilisez simplement itheroTools.chain.from_iterable : http://docs.python.org/library/itétools.html#itertools.chain.from_iterable


0 commentaires

1
votes

Essayez ceci:

from itertools import chain 

c = set()
reqs = 0
for vid, number in chain(*your_list): 
    c.add(vid)
    reqs += number 


0 commentaires

-1
votes

extraire tous les tuples d'une structure de données ... xxx

peut-être ...


11 commentaires

Que se passe-t-il si j'appelle get_tups ([('foo',)]) ?


Étant donné que l'entrée contient 1 tuple, vous obtiendrez une liste contenant le 1 tuple. En d'autres termes, la sortie sera la même que l'entrée;)


Et puis, que se passe-t-il si je l'appelle une seconde fois? Voici un indice: ideone.com/zgmzq


ahh. Pourquoi Z n'est-il pas une liste vide la deuxième fois qu'elle est appelée?


Parce que vous appendez une valeur à celle-ci dans votre code et que l'expression z = [] est évaluée dans le cadre de la déclaration def .


get_tups ([('foo',)]] get_tups ([("foo ',)]]) .. à la ligne 2, je n'assite aucune variable pour z. Par conséquent, je m'attendrais à ce qu'il assume []


C'est votre travail de dire à l'ordinateur quoi faire, sans espoir que cela fait des hypothèses.


Laissez-moi reformuler. Je m'attendrais à ce qu'il soit par défaut [], puisque le paramètre est un paramètre par défaut et n'est pas transmis dans la méthode. Il semble "rappeler" la valeur précédente de z. comme c'est un global ou quelque chose. Je pensais que la portée de Z était dans la méthode elle-même. Par conséquent, la deuxième fois, elle a été appelée, elle réinitialiserait []. désolé si je suis stupide


J'ai déjà expliqué pourquoi cela se produit: z = [] est évalué dans le cadre de la déclaration def . Incidemment, votre fonction ne fait pas non plus face à une entrée circulaire: ideone.com/yOaps


Pour complétude, j'ai corrigé le code - Ideone.com/o8po6 . merci pour votre aide @marcin


Impressionnant. Vous pouvez éditer votre réponse - c'est certainement encouragé.



2
votes

Voici un autre (pas de bibliothèques): xxx


2 commentaires

Pourquoi créez-vous une fonction nommée au lieu d'une Lambda?


Juste pour la clarté, pas de raison particulière.



9
votes

Il existe un moyen très simple de le faire avec des compréhensions de la liste. Cet exemple a été documenté dans la documentation Python ici

In [59]: your_list = [[('video1',4)], [('video2',5),('video3',8)], [('video1',5)], [('video5', 7), ('video6',9)]]

In [60]: improved_list = [num for elem in your_list for num in elem]

In [61]: improved_list
Out[61]: 
[('video1', 4),
 ('video2', 5),
 ('video3', 8),
 ('video1', 5),
 ('video5', 7),
 ('video6', 9)]


0 commentaires

3
votes

Si cette liste est imbriquée de manière unique (liste des listes), vous pouvez le faire, que j'utilise beaucoup : xxx

Cela fonctionne en raison du fait que la somme accomplit simplement les listes et l'ajout de listes d'option fonctionne dans Python comme prévu :)

note : cela est inefficace et certains disent illisible.


0 commentaires