2015-02-13 5 views
1

Id нравится писать процедуру, которая возвращает список кортежей. K-й элемент в каждом кортеже, соответствующий сумме k-го элемента кортежей в списках, заданных как вход.Функция, которая возвращает список кортежей.

А = [(1,2), (3,4)] В = [(10,20), (30,40)]

возвратит

[(11 , 22), (33, 44)]

def sumtuple(A,B): 
    ret = [] 
    for K in A: 
     for L in B: 
      ret.append(K[0] + L[0], K[1] + L[1]) 
return ret 

Существует несколько явных недостатков с моей попытки, это дает некоторые нежелательные результаты, например, это дает (13,24) в ответ. Я понимаю, почему это происходит неправильно. Но то, что я не могу сделать, это написать код, который дает мне результат, который я хочу.

Я новичок, будьте добры.

+0

А вы имеем дело только с 2-кортежей, или же он должен работать для всех кортежей размеры? – Blckknght

+0

На данный момент меня интересуют пары. –

ответ

2

Использование zip в цикле по обоим спискам одновременно:

def sumtuple(A,B): 
    ret = [] 
    for a, b in zip(A, B): 
     ret.append((a[0] + b[0], a[1] + b[1])) 

    return ret 
0

вы можете попробовать, как это:

def sumtuple(A,B): 
    ret = [] 
    for K in range(len(A)): 
     ret.append(A[K][0] + B[K][0], A[K][1] + B[K][1]) 
    return ret 
+0

Хорошие ответы сопровождаются образцами кода с объяснением будущих читателей. Хотя человек, задающий этот вопрос, может понять ваш ответ, объяснение того, как вы пришли к нему, может помочь бесчисленным другим. – Stonz2

0

использованием map с operator.add и zip_longest работать на неровных списков длины:

from operator import add 
from itertools import zip_longest 

print([tuple(map(add, a, b)) for a,b in zip_longest(A,B,fillvalue=(0,0))]) 
[(11, 22), (33, 44)] 

You wo не потерять данные, если один список является различная длина:

A = [(1, 2), (3, 4)] 
B = [(10, 20), (30, 40),(10,12)] 
print([tuple(map(add, a, b)) for a,b in zip_longest(A,B,fillvalue=(0,0))]) 
[(11, 22), (33, 44), (10, 12)] 
0

Изготовлены из вашей функции :)

def sumtuple(A,B): 
    b=[] 
    for i in range(len(A)): 
     l=[] 
     for j in range(len(A[i])): 
      l.append(A[i][j]+B[i][j]) 
     l=tuple(l) 
     b.append(l) 
    return b 
Смежные вопросы