2010-11-12 3 views
5

Comment créer une liste et extraire ou rechercher uniquement les nombres pairs dans cette liste?Numéros pairs une liste?

Créez une fonction even_only(l) qui prend comme seul argument une liste d'entiers. La fonction renverra une nouvelle liste contenant tous (et seulement) les éléments de l qui sont divisibles de manière égale par 2. La liste originale l doit rester inchangée.

Pour des exemples, even_only([1, 3, 6, 10, 15, 21, 28]) devrait revenir [6, 10, 28] et even_only([1, 4, 9, 16, 25]) devrait revenir [4, 16]. Astuce: Commencez par créer une liste vide, et chaque fois que vous y rencontrez un nombre pair, ajoutez-le à votre liste, puis à la fin, renvoyez votre liste.

+2

la seule chose que je peux penser est d'utiliser une boucle for dans la fonction où la gamme de l'entrée sera testée pour voir si elle est divisible par 2 uniformément. –

+0

Vous devriez rechercher la division modulaire vous aidera une tonne. En outre, le "créer une liste vide" est faisable, mais vous pouvez également regarder le filtre. –

+1

@justin: C'est très bien. Si vous voulez une aide plus spécifique, écrivez du code et montrez-nous ce qui ne fonctionne pas. –

Répondre

10

"main":

def even_only(lst): 
    evens = [] 
    for number in lst: 
     if is_even(number): 
      evens.append(number) 
    return evens 

Pythonic:

def even_only(iter): 
    return [x for x in iter if is_even(x)] 

Depuis son travail, vous pouvez remplir la fonction is_even.

+0

il manque un retour d'expérience dans le premier exemple –

+0

Quelle erreur stupide. Merci d'avoir attrapé ça, Xavier. –

+0

Merci pour l'algorithme, j'ai pensé à la main =) –

7

La manière la plus simple serait de faire ce que vous avez posté dans un commentaire - parcourir la liste des entrées pour trouver les chiffres divisibles de 2, et les ajouter à la liste de retour si c'est le cas. La fonction list.append(x) vous aidera à ajouter un élément à une liste.

également comme mentionné, regardez en utilisant l'opération modulo pour déterminer si un nombre est divisible par 2 ...

+0

une idée sur comment utiliser la plage d'une liste quand elle n'accepte que des nombres entiers? –

2

La meilleure façon de le faire (en tant que débutant) est probablement une liste de compréhension. Comme il est un devoir, je ne le ferai pas pour vous, mais voici la syntaxe:

[x for x in your_list if (your condition)] 

Il vous suffit de remplacer (votre état) avec ce qui convient bien (en fait, exactement ce que vous avez décrit).

P.S. Je sais que certaines personnes peuvent dire que les listes de compréhension sont un peu avancées pour un débutant, mais je pense que ce n'est pas un concept trop difficile à saisir et extrêmement utile.

+0

apprendre à connaître une boucle 'for' serait beaucoup plus utile pour lui, étant donné qu'une boucle for existe dans presque tous les langages de programmation, ce qui n'est pas le cas de la liste compréhensions. –

+0

Je dois me demander - pensez-vous vraiment que quelqu'un dans CS101 qui ne sait pas comment dire même de bizarre devrait être proche de la compréhension de la liste? C'est donner un bâton de dynamite à quelqu'un qui n'est pas encore clair sur le but d'une mèche. –

+0

Bien sûr, il doit savoir ce qu'est une boucle for, cela ne signifie pas qu'il doit sauter des listes de compréhension. Ils ne sont pas du tout difficiles à comprendre, ils sont extrêmement communs dans le code Python, etc. Et parce qu'il n'existe pas dans tous les langages de programmation, cela ne veut pas dire qu'il doit être appris en dernier. –

2

Utilisez la fonction filter pour ce faire d'une manière fonctionnelle:

>>> even_filter = lambda x: not x % 2 
>>> result = filter(even_filter, [0, 1, 2, 3, 4]) 
>>> assert result == [0, 2, 4] 

Edit: mise à jour avec la parité correcte de zéro par le commentaire de Vincent.

+2

Pour autant que je sache, 0 est même (http://en.wikipedia.org/wiki/Parity_of_zero) –

2
>>> a = [1, 3, 6, 10, 15, 21, 28] 
>>> b = [i for i in a if i%2 ==0 ] 
>>> b 
[6, 10, 28] 
>>> a 
[1, 3, 6, 10, 15, 21, 28] 
+0

fermer mais il imprime seulement la liste originale. –

+0

Qu'est-ce qui n'imprime que la liste d'origine? – Falmarri

+0

c'est la meilleure réponse – clg4

2
>>> even_only = lambda seq : [ x for x in seq if str(x)[-1] in "02468" ] 
>>> even_only([1, 3, 6, 10, 15, 21, 28]) 
[6, 10, 28] 
+0

Hmmm ... chaîne de conversion dans une fonction anonyme qui vérifie les indices négatifs .... comme une réponse aux devoirs. Comme ça, le plaigle ne serait pas écrit partout! ': D + 1' – Droogans

1

J'ai eu récemment cette question et utilisé:

list=[1,2,3,4,5,6] #whatever your list is, just a sample 
evens=[x for x in list if np.mod(x,2)==0] 
print evens 

retours [2,4,6]

-1

Tous = (1, 3, 6, 10, 15, 21, 28] De itertools importer TakeWhile Evenonly = TakeWhile (lambda x: x% 2 == 0, Tous) Imprimer (liste (Evenonly)

Questions connexes