Je me demande quelle est la meilleure façon d'extraire le premier élément de chaque sous-liste dans une liste de listes et de l'ajouter à une nouvelle liste. Donc si j'ai:
lst = [[a,b,c], [1,2,3], [x,y,z]]
et je veux me retirer a
, 1
et x
créer une liste séparée de ceux -ci .
J'ai essayé:
lst2.append(x[0] for x in lst)
Réponses:
Utilisation de la compréhension de liste :
la source
Vous pouvez utiliser zip:
Ou, Python 3 où
zip
ne produit pas de liste:Ou,
Ou, (mon préféré) utilisez numpy:
la source
list
autour première ou utilisationnext
. MerciJ'ai eu le même problème et j'étais curieux de connaître les performances de chaque solution.
Voici le
%timeit
:Le premier numpy-way, transformant le tableau:
Entièrement natif en utilisant la compréhension de liste (comme expliqué par @alecxe):
Une autre façon native d'utiliser
zip
(comme expliqué par @dawg):Deuxième façon numpy. Egalement expliqué par @dawg:
Étonnamment (enfin, du moins pour moi), la méthode native utilisant la compréhension de liste est la plus rapide et environ 10 fois plus rapide que la méthode numpy. Exécuter les deux numpy-way sans la finale
list
permet d'économiser environ un µs, ce qui est toujours dans la différence de 10x.Notez que, lorsque j'ai entouré chaque extrait de code d'un appel à
len
, pour m'assurer que les générateurs fonctionnent jusqu'à la fin, le timing est resté le même.la source
Python inclut une fonction appelée itemgetter pour renvoyer l'élément à un index spécifique dans une liste:
Passez à la fonction itemgetter () l'index de l'élément que vous souhaitez récupérer. Pour récupérer le premier élément, vous utiliseriez itemgetter (0). La chose importante à comprendre est que itemgetter (0) lui-même renvoie une fonction. Si vous passez une liste à cette fonction, vous obtenez l'élément spécifique:
Ceci est utile lorsque vous le combinez avec map (), qui prend une fonction comme premier argument, et une liste (ou tout autre itérable) comme deuxième argument. Il renvoie le résultat de l'appel de la fonction sur chaque objet de l'itérable:
Notez que map () renvoie un générateur, donc le résultat est passé à list () pour obtenir une liste réelle. En résumé, votre tâche pourrait être effectuée comme ceci:
Il s'agit d'une méthode alternative à l'utilisation d'une compréhension de liste, et la méthode à choisir dépend fortement du contexte, de la lisibilité et des préférences.
Plus d'infos: https://docs.python.org/3/library/operator.html#operator.itemgetter
la source
Votre code est presque correct. Le seul problème est l'utilisation de la compréhension de liste.
Si vous utilisez comme: (x [0] pour x dans lst), cela renvoie un objet générateur. Si vous utilisez comme: [x [0] pour x dans lst], cela renvoie une liste.
Lorsque vous ajoutez la sortie de compréhension de liste à une liste, la sortie de compréhension de liste est l'élément unique de la liste.
lst2 = [['a', 1, 'x']]
lst2 [0] = ['a', 1, 'x']
Veuillez me faire savoir si je me trompe.
la source
Production:
['a', 1, 'x']
la source
Vous avez dit que vous avez une liste existante. Alors je vais y aller.
En ce moment, vous ajoutez l'objet générateur à votre deuxième liste.
Mais vous voulez probablement que ce soit une liste des premiers éléments
Nous avons maintenant ajouté la liste des premiers éléments à la liste existante. Si vous souhaitez ajouter les thèmes des éléments eux-mêmes, pas une liste d'entre eux, aux éléments existants, vous utiliserez list.extend. Dans ce cas, nous n'avons pas à nous soucier d'ajouter un générateur, car extend utilisera ce générateur pour ajouter chaque élément qu'il obtient à partir de là, pour étendre la liste actuelle.
ou
https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list-comprehensions
la source
append
dans la question est source de confusion. Il semble qu'il / elle souhaite simplement la partie compréhension de la liste de votre solution.