2009-10-05 14 views
7

Tworzę listę 2D i chciałbym ją zainicjować ze zrozumieniem listy. Chciałbym to zrobić coś takiego:Python: Zrozumienie listy, aby przypisać różne wartości

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

więc powinien powrócić coś takiego:

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

Jak mogę to zabrać?

Dzięki za pomoc.

Odpowiedz

14

Wydaje się, że szukasz czegoś takiego:

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

Python conditional expression różni się nieco od tego, co może być wykorzystane do jeśli jesteś z czegoś takiego jak C lub Java:

wyrażenie x if C else y ocenia najpierw C (nie x); jeśli jest prawdziwe, to jest obliczane i zwracana jest jego wartość; w przeciwnym razie zostanie oszacowany y i zwrócona zostanie jego wartość.

Nieco krótsza droga zrobić to samo jest:

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

To jest dobre, ponieważ można łatwo skalować poprzez zmianę rozmiaru i zakresu zmiany instrukcji warunkowej. Dzięki! – Nope

14

odpowiedź Grega jest poprawne, choć znacznie prostsze i szybsze wyrażenie produkować pożądany rezultat byłby

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

tzn. pamiętaj, że for nie musi mieć zastosowania tylko do range ;-), mnożenie listy istnieje i tak dalej ;-).

+0

Podoba mi się ta odpowiedź, schludnie – Juparave

+0

Czy pozwala to na to, aby tabela nadal mogła być zmieniana? powiedzieć, że chcę zmienić [0] [0] na 10, czy to spowoduje zmianę jakiejkolwiek innej wartości? – Nope

+0

@Casey - Nie, nie zmieni żadnej z pozostałych wartości. –

1

Spróbuj że

>>> [[(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]] 

Drugi raz j = 1, tak j < 1 nie