web-dev-qa-db-fra.com

Extraire les éléments de la liste en positions impaires

Donc, je veux créer une liste qui est une sous-liste d'une liste existante.

Par exemple,

L = [1, 2, 3, 4, 5, 6, 7], Je veux créer une sous-liste li telle que li contienne tous les éléments de L à des positions impaires.

Alors que je peux le faire par

L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
    if count % 2 == 1:
        li.append(i)
    count += 1

Mais je veux savoir s'il existe un autre moyen de faire la même chose efficacement et en moins d'étapes.

82
veepsk

Solution

Oui, vous pouvez:

l = L[1::2]

Et c'est tout. Le résultat contiendra les éléments placés sur les positions suivantes (basé sur 0, Le premier élément est donc sur la position 0, Le second sur 1, Etc.):

1, 3, 5

donc le résultat (nombre réel) sera:

2, 4, 6

Explication

Le [1::2] À la fin est juste une notation pour le découpage de liste. Habituellement, il se présente sous la forme suivante:

some_list[start:stop:step]

Si nous omettions start, la valeur par défaut (0) Serait utilisée. Ainsi, le premier élément (à la position 0, Car les index sont basés sur 0) Serait sélectionné. Dans ce cas, le deuxième élément sera sélectionné.

Comme le deuxième élément est omis, la valeur par défaut est utilisée (la fin de la liste). Donc la liste est itérée du deuxième élément à la fin .

Nous avons également fourni un troisième argument (step) qui est 2. Ce qui signifie qu'un élément sera sélectionné, le suivant sera ignoré, etc.

Donc, pour résumer, dans ce cas [1::2] Signifie:

  1. prenez le deuxième élément (qui, soit dit en passant, est un élément impair, à en juger par l'index),
  2. ignorer un élément (parce que nous avons step=2, nous en sautons un, contrairement à step=1, qui est la valeur par défaut),
  3. prenez l'élément suivant,
  4. Répétez les étapes 2.-3. jusqu'à la fin de la liste,

[~ # ~] éditer [~ # ~] : @PreetKukreti a donné un lien pour une autre explication sur la notation de découpage en tranches de la liste de Python. Voir ici: Expliquez la notation de tranche de Python

Extras - remplacement du compteur par enumerate()

Dans votre code, vous créez et augmentez explicitement le compteur. Dans Python, cela n'est pas nécessaire, car vous pouvez énumérer certaines itérations à l'aide de enumerate() :

for count, i in enumerate(L):
    if count % 2 == 1:
        l.append(i)

Ce qui précède a exactement le même objectif que le code que vous utilisiez:

count = 0
for i in L:
    if count % 2 == 1:
        l.append(i)
    count += 1

Plus d'informations sur l'émulation de for boucles avec un compteur en Python: Accès à l'index dans Python 'pour' boucles '

193
Tadeck

Pour les impairs positions, vous voulez probablement:

>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
10
dstromberg

J'aime les compréhensions de liste en raison de leur syntaxe Math (Set). Alors que diriez-vous de ceci:

L = [1, 2, 3, 4, 5, 6, 7]
odd_numbers = [y for x,y in enumerate(L) if x%2 != 0]
even_numbers = [y for x,y in enumerate(L) if x%2 == 0]

En gros, si vous énumérez une liste, vous obtenez l'index x et la valeur y. Ce que je fais ici, c’est de mettre la valeur y dans la liste de résultats (paire ou impaire) et d’utiliser l’index x pour savoir si ce point est impair (x%2 != 0).

3
peterb