3
votes

Comment ne rien renvoyer ou sauter un certain élément dans une liste si ce n'est pas étrange

Je suis très nouveau en Python et j'ai du mal à convertir mes pensées en syntaxe.

Voici le problème qui m'a été posé:

Étant donné un tableau 1 par n a, écrivez une fonction odd (a) pour renvoyer un nouveau tableau contenant des éléments dont l'index est un nombre impair. p >

[1, 3, '', '', 5, 3, '', 1]

et voici ce que j'ai jusqu'à présent:

def odd(a):
    return ['' if x%2==0 else x for x in a]

Ceci, cependant, renvoie:

a = np.array([1, 3, 4, 2, 5, 3, 8, 1])

odd(a) = array([3, 2, 3, 1])

Comment puis-je simplement ignorer cet élément?


4 commentaires

Déplacez le conditionnel à la fin de la compréhension de la liste, où il filtre au lieu de mapper: pour x dans un if x% 2 == 0 .


De plus, x n'est pas l'index de votre élément mais l'élément lui-même.


La chose clé à noter est qu'un "if else" vient avant "for" dans la compréhension de liste, mais un pur "if" va à la fin. Il suffit de s'habituer à la syntaxe.


@jonrsharpe Bon point. Il peut être plus facile de lire et de comprendre la syntaxe de compréhension en réfléchissant à la façon dont vous écririez l'expression pour l'ensemble en mathématiques. Soudain, la notation avec le si à la fin devient intuitive.


3 Réponses :


2
votes

Utilisez enumerate pour parcourir l'élément et son index simultanément et avec la condition index% 2 pour extraire toutes les valeurs de position impaires:

import numpy as np

def odd(a):
    return [x for i, x in enumerate(a) if i % 2]

a = np.array([1, 3, 4, 2, 5, 3, 8, 1])
print(odd(a))

# [3, 2, 3, 1]

p>


2 commentaires

Je vous remercie! Que signifie?


@MimiChung, c'est un opérateur de mod, trouvant essentiellement le reste de l'opération de division. S'il y a un reste quand un nombre est divisé par 2, alors le nombre est certainement un nombre impair.



1
votes
import numpy as np

odd = lambda a: [a[i] for i in range(len(a)) if i%2]

a = np.array([1, 3, 4, 2, 5, 3, 8, 1])
print(odd(a)) # -> [3, 2, 3, 1]

0 commentaires

3
votes

Utilisez slice and step (voir la référence ici: Comprendre la notation de tranche ):

def odd(a):
  return a[1::2]

#=> [3 2 3 1]


1 commentaires

Je pensais faire cela au début, mais je ne savais même pas comment écrire l'incrément! Je vous remercie