2009-10-05 6 views
7

Je fais une liste 2D et je voudrais l'initialiser avec une compréhension de liste. Je voudrais qu'il fasse quelque chose comme ceci:Python: Liste de la compréhension pour assigner différentes valeurs

[[x for i in range(3) if j <= 1: x=1 else x=2] for j in range(3)] 

il devrait retourner quelque chose comme:

[[1,1,1], 
[1,1,1], 
[2,2,2]] 

Comment pourrais-je aller à faire cela?

Merci pour votre aide.

Répondre

14

Il semble que vous cherchez quelque chose comme ceci:

[[1 if j <= 1 else 2 for i in range(3)] for j in range(3)] 

Le Python conditional expression est un peu différent de ce que vous pourriez être utilisé pour si vous venez de quelque chose comme C ou Java:

x if C else y

L'expression évalue d'abord C (pas x); si C est vrai, x est évalué et sa valeur est retournée; sinon, y est évalué et sa valeur est retournée.

Une façon de faire la même chose un peu plus courte est:

[[1 if j <= 1 else 2]*3 for j in range(3)] 
+0

Ce qui est bon puisque je peux facilement évoluer en changeant la taille de la plage et modifier l'instruction conditionnelle. Merci! – Nope

14

réponse de Greg est correct, mais une expression beaucoup plus simple et plus rapide pour produire le résultat souhaité serait

[[j] * 3 for j in (1, 1, 2)] 

c'est-à-dire, rappelez-vous que for ne doit pas s'appliquer à un range seulement ;-), la liste-multiplication existe, et ainsi de suite ;-).

+0

J'aime cette réponse, soignée – Juparave

+0

Est-ce que cela permet à la table d'être encore modifiable? disons que je veux changer [0] [0] à 10, cela changera-t-il l'une des autres valeurs? – Nope

+0

@Casey - Non, cela ne changera aucune des autres valeurs. –

1

Essayez que

>>> [[(1 if j<1 else 2) for i in range(3)] for j in range(3)] 
[[1, 1, 1], [2, 2, 2], [2, 2, 2]] 

La deuxième fois j = 1 j si < 1 ne

Questions connexes