Ответ 1
sum
работает здесь:
total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
Я использую много 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
sum
работает здесь:
total = sum(x+y for x in (0,1,2,3) for y in (0,1,2,3) if x < y)
В качестве альтернативы написанию циклов 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 измерений.
Используйте numpy. Это позволяет использовать массивы, которые складываются как векторы:
x = numpy.arange(3)
y = numpy.arange(3)
total = x + y
С измененным вопросом добавьте вызов sum
, а также
total = numpy.sum(x+y)
Функция уменьшения напрямую сводит коллективные элементы к одному элементу. Вы можете узнать больше о них здесь, но это должно сработать для вас:
total=reduce(lambda x,y:x+y,range(4))
или
total=reduce(lambda x,y:x+y,(0,1,2,3))
Другая возможность:
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)
Таким образом, вы можете перебирать все, что вы использовали бы в понимании списка, не создавая по существу осмысленного списка (если вы понимаете мой смысл;) Если постигаемый список большой, может быть, он настолько насыщен или даже не подходит в памяти, это весьма удобно..