2009-11-12 6 views
2
M = [[1,2,3], 
    [4,5,6], 
    [7,8,9]] 

col2 = [row[1] + 1 for row in M if row[1] % 2 == 0] 
print (col2) 

Sortie: [3, 9]nombres impairs Filtrage

Je me attends à filtrer les nombres impairs, mais il fait le contraire.

+0

Aiderait si vous avez posté votre sortie prévue à l'avenir –

Répondre

6

Le code fait exactement ce que vous attendez - si le second élément est pair, augmentez-le d'une unité et placez-le dans la liste. Donc, pour la première ligne, on voit que 2% 2 == 0 est vrai, et col2 [0] = 2 + 1 = 3. Pour la deuxième ligne, 5% 2 == 0 est faux. Pour la troisième ligne, 8% 2 == 0 est vrai, et col2 [1] = 8 + 1 = 9.

+0

Oh, donc il lit d'abord l'instruction IF? Je pensais que les déclarations ont été traitées gauche-t-droite? – 3zzy

+1

Oui - les compréhensions de liste autorisent plusieurs conditions après la boucle for, et l'expression sur la gauche est évaluée après avoir pris en compte toutes ces conditions. (explication technique: http://docs.python.org/reference/expressions.html#list-displays) –

0

Vous testez row[1]%2, mais l'impression row[1]+1
donc quand row[1]==2, il est même, mais vous apposent 3 au résultat
quand row[1]==5, il est étrange, de sorte que vous la filtrer sur
et quand row[1]==8, il est même, mais vous apposent 9 au résultat

2

Je crois que vous devez changer la comparaison à == 1 à partir de == 0.

Le module de n'importe quel nombre divisé par 2 est 0 ou 1, 1 quand il est impair.

+0

Hmm..pas vraiment. J'ai essayé ceci: pour n dans la gamme (10): n = n% 2 et il a imprimé ODD comme '0' – 3zzy

0
M = [[1,2,3], 
    [4,5,6], 
    [7,8,9]] 
col2 = [] 

for row in M: 
    if row[1]%2 == 1: 
     col2.append(row[1]) 
print col2 
Questions connexes