Понимание списка для циклов Python - PullRequest
25 голосов
/ 21 октября 2011

Я использую много N-мерных массивов, и мне сложно писать такой код с отступом, и я знаю, что некоторые коды можно заменить на списки и встроенные операторы.Например:

for x in (0,1,2,3):
    for y in (0,1,2,3):
        if x < y:
            print (x, y, x*y)

можно заменить на:

print [(x, y, x * y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y]

Но как я могу изменить действие вместо печати, чтобы сделать что-то еще как:

total = x+y

Так что я хочу сделать что-то вроде:

[(total+=x+y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y]

Однако это не работает

Есть ли разумный способ сделать это, а не:

for x in (0,1,2,3):
        for y in (0,1,2,3):
            if x < y:
                total+=x+y

Ответы [ 5 ]

32 голосов
/ 21 октября 2011

sum работает здесь:

total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
12 голосов
/ 21 октября 2011

В качестве альтернативы написанию циклов глубиной N уровней можно использовать itertools.product():

In [1]: import itertools as it

In [2]: for x, y in it.product((0,1,2,3),(0,1,2,3)):
   ...:     if x < y:
   ...:         print x, y, x*y

0 1 0
0 2 0
0 3 0
1 2 2
1 3 3
2 3 6

Это естественным образом распространяется на N измерений.

5 голосов
/ 21 октября 2011

Используйте numpy .Это позволяет использовать массивы, которые складываются как векторы:

x = numpy.arange(3)
y = numpy.arange(3)
total = x + y

С измененным вопросом также добавьте вызов к sum

total = numpy.sum(x+y)
2 голосов
/ 04 мая 2013

Другая возможность:

for x,y in ((x,y) for x in (0,1,2,3) for y in (0,1,2,3) if x < y):
  print (x, y, x * y)

Таким образом, вы можете перебирать все, что будете использовать в понимании списка, фактически не создавая понятный список (если вы понимаете мое значение;) Если понятный список большой, может быть настолько большой, что он насыщает или даже не подходит в памяти, это очень удобно ..

2 голосов
/ 11 апреля 2013

Функция уменьшения напрямую сводит коллективные элементы к одному элементу.Вы можете узнать больше о них здесь , но это должно работать для вас:

total=reduce(lambda x,y:x+y,range(4))

или

total=reduce(lambda x,y:x+y,(0,1,2,3))
...