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.
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
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:
step=2
, nous en sautons un, contrairement à step=1
, qui est la valeur par défaut),[~ # ~] é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
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 '
Pour les impairs positions, vous voulez probablement:
>>>> list_ = list(range(10))
>>>> print list_[1::2]
[1, 3, 5, 7, 9]
>>>>
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
).