Сумма каждого элемента в списке кортежей Python - PullRequest
3 голосов
/ 23 февраля 2012

Я хочу добавить каждый элемент списка, содержащий кортежи. Например,

    >>> list1
    [(0, 1, 2), (3, 4, 5), (6, 7, 8)]
    >>> list2
    [(1, 2, 3), (4, 5, 6), (7, 8, 9)]

Ответ должен быть

     list3 = [(1,3,5),(7,9,11),(13,15,17)]

Ответы [ 6 ]

8 голосов
/ 23 февраля 2012

zip - ваш друг здесь.

result = []
for ta, tb in zip(list1, list2):
     t =tuple(a+b for a, b in zip(ta, tb))
     result.append(t)

print result
>> [(1,3,5),(7,9,11),(13,15,17)]

или более pythonic:

result = [tuple(a+b for a, b in zip(ta, tb)) for ta, tb in zip(list1, list2)]
print result
>> [(1,3,5),(7,9,11),(13,15,17)]

результат может быть просто генератором, выполнив это:

result = (tuple(a+b for a, b in zip(ta, tb)) for ta, tb in zip(list1, list2))
4 голосов
/ 23 февраля 2012
>>> list1 = [(0, 1, 2), (3, 4, 5), (6, 7, 8)]
>>> list2 = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
>>> [tuple(map(sum, zip(*i))) for i in zip(list1, list2)]
[(1, 3, 5), (7, 9, 11), (13, 15, 17)]

Хорошая особенность этого способа заключается в том, что он также работает для произвольного числа списков

>>> list3 = [tuple(map(sum, zip(*i))) for i in zip(list1, list2)]
>>> [tuple(map(sum, zip(*i))) for i in zip(list1, list2, list3)]
[(2, 6, 10), (14, 18, 22), (26, 30, 34)]
3 голосов
/ 23 февраля 2012

Вы можете использовать понимание списка, хотя это немного неловко:

list3 = [tuple(x + y for x, y in zip(t1, t2))
         for t1, t2 in zip(list1, list2)]

Если вам подходит список списков вместо списков кортежей, альтернативой является

list3 = [map(operator.add, *t) for t in zip(list1, list2)]
1 голос
/ 23 февраля 2012

Редактировать: ниже совсем не нужно.Встроенная функция map автоматически архивирует несколько передаваемых ей итераций, поэтому zip_with(func, iter1, iter2) можно заменить на map с теми же аргументами.

map(functools.partial(map, op.add), list1, list2)

Этот раздел не нужен

Вот фрагмент кода, реализующий что-то по принципу zipWith

def zip_with(func, xs, ys):
    return [func(x, y) for (x, y) in zip(xs, ys)]

In [1]: def zip_with(func, xs, ys):
   ...:         return [func(x, y) for (x, y) in zip(xs, ys)]
   ...: 

In [2]: import operator as op

In [3]: zip_with(op.add, [1,2,3], [4,5,6])
Out[3]: [5, 7, 9]

In [4]: import functools

In [5]: zip_with(functools.partial(zip_with, op.add), list1, list2)
Out[5]: [[1, 3, 5], [7, 9, 11], [13, 15, 17]]
на Haskell
1 голос
/ 23 февраля 2012
>>> [tuple(sum(pair) for pair in zip(a,b)) for a,b in zip(list1,list2)]
[(1, 3, 5), (7, 9, 11), (13, 15, 17)]
0 голосов
/ 23 февраля 2012
import operator
list3 = [tuple(map(operator.add, list1[i], list2[i]))
 for i in range(len(list1))]
...