2011-12-06 3 views
1

Je ne suis pas familier avec Python et je n'arrive pas à comprendre comment appliquer une liste de compréhension à une partie d'une liste imbriquée (en particulier au niveau de l'index).Listes imbriquées et compréhensions de listes

Par exemple, si je donne les résultats suivants:

my_list = [[1,2], [3,7], [6,9], [4,3]] 

new_list = [[i*2 for i in sublist] for sublist in my_list] 

Comment pourrais-je modifier ma compréhension de liste pour l'appliquer uniquement l'opération à l'index 1 de chaque sous-liste? J'ai beaucoup expérimenté sans succès.

+1

Il n'y a aucune condition dans votre code. Indiquez le type de sortie que vous souhaitez obtenir pour cette liste (qui contient des erreurs de syntaxe, btw.). –

Répondre

2

Une version plus générale de mac's:

>>> my_list = [[1,2], [3,7], [6,9], [4,3]] 
>>> new_list = [[v*2 if i==0 else v for i,v in enumerate(sublist)] for sublist in my_list] 
>>> new_list 
[[2, 2], [6, 7], [12, 9], [8, 3]] 
+0

Lié de ma propre réponse. :) – mac

+0

bons dieux l'homme O.o, peut aussi bien utiliser 'itertools.chain' qui serait beaucoup plus efficace. – Serdalis

0

-vous dire quelque chose comme ceci:

my_list = [[1,2], [3,7], [6,9], [4,3]] 

new_list = [sublist[0]*2 for sublist in my_list] 

Output: 
    new_list == [2, 6, 12, 8] 

aussi, vous avez oublié de mettre des virgules entre vos sous-listes (fixes dans ma réponse)

Je suppose que par «l'index 1 vous voulez dire le premier élément.
Si vous voulez dire le deuxième élément (qui est l'index 1), vous utiliserez sublist[1] au lieu de sublist[0].

+0

Merci. J'ai réalisé mes erreurs de syntaxe peu de temps après l'affichage (et corrigé) - je voulais juste taper du code simple afin que je puisse comprendre le concept. Je ne peux pas croire que je ne l'ai pas vu avant. Très apprécié – donopj2

+0

@ donopj22 pas de problème, est-ce que cela a fait ce que vous vouliez? ou vouliez-vous quelque chose de différent? – Serdalis

+0

Oui, toutes les réponses étaient vraiment très utiles. J'apprécie la contribution de tout le monde. – donopj2

1

Vous cherchez cet?

>>> my_list = [[1,2], [3,7], [6,9], [4,3]] 
>>> [[sublist[0] * 2, sublist[1]] for sublist in my_list] 
[[2, 2], [6, 7], [12, 9], [8, 3]] 

EDIT: La solution ci-dessus ne serait pas bien échelle si vous aviez sous-listes de nombreux éléments. Si tel est le cas pour vous, une alternative pourrait être la cartographie utilisation:

>>> my_list = [[1,2], [3,7], [6,9], [4,3]] 
>>> def double_first(list_): 
...  list_[0] *= 2 
...  return list_ 
... 
>>> map(double_first, my_list) 
[[2, 2], [6, 7], [12, 9], [8, 3]] 

EDIT2: La solution dans mon premier montage permet de mettre en œuvre tout type de manipulation sur les sous-listes, mais si l'opération est simple et seulement dépendant de l'index de la sous-liste, Dan's solution fonctionnera plus rapidement.

HTH!