Python: понимание списка для назначения различных значений - PullRequest
7 голосов
/ 06 октября 2009

Я делаю 2D-список, и я хотел бы инициализировать его с пониманием списка. Я хотел бы сделать что-то вроде этого:

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

поэтому должно возвращаться что-то вроде:

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

Как мне это сделать?

Спасибо за вашу помощь.

Ответы [ 3 ]

14 голосов
/ 06 октября 2009

Ответ Грега верен, хотя гораздо более простое и быстрое выражение для получения желаемого результата будет

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

То есть, помните, что for не нужно применять только к range ;-), умножение списка существует и т. Д .; -).

14 голосов
/ 06 октября 2009

Похоже, вы ищете что-то вроде этого:

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

Условное выражение Python немного отличается от того, к чему вы могли бы привыкнуть, если вы работаете с чем-то вроде C или Java:

Выражение x if C else y сначала оценивает C ( не x ); если C равно true, x оценивается и возвращается его значение; в противном случае y оценивается и возвращается его значение.

Немного более короткий способ сделать то же самое:

[[1 if j <= 1 else 2]*3 for j in range(3)]
1 голос
/ 06 октября 2009

Попробуйте это

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

Во второй раз j = 1, поэтому j <1 не удается </p>

...