2016-10-28 7 views
3

Как я могу подвести кортеж в список кортежей, таких как:Добавить кортеж в список кортежей

>>> a = [(0, 1, 2), (3, 4, 5), (6, 7, 8)] 
>>> b = (10, 20, 30) 

результат существо:

>>> c 
[(10, 21, 32), (13, 24, 35), (16, 27, 38)] 

Я знаю, что это может быть легко решена с numpy:

>>> import numpy 
>>> c = numpy.add(a, b).tolist() 
>>> c 
[[10, 21, 32], [13, 24, 35], [16, 27, 38]] 

но я предпочел бы избегать numpy.

ответ

4

один вкладыш с использованием вложенных списковыми и волшебный zip чередовать неподвижную b триплета добавить к перебору элементу a, не NumPy не требуется:

a = [(0, 1, 2), (3, 4, 5), (6, 7, 8)] 
b = (10, 20, 30) 

c = [tuple([i+j for i,j in zip(e,b)]) for e in a] 
print(c) 

результат:

[(10, 21, 32), (13, 24, 35), (16, 27, 38)] 

EDIT: вы можете отказаться от преобразования tuple, если это необходимо:

c = [[i+j for i,j in zip(e,b)] for e in a] 
+0

спасибо, работает Как колдовство! – hstay

+0

вариация этого с использованием 'map' и' sum' is '[tuple (map (sum, zip (x, b))) для x в a]' – Copperfield

3

Вы можете сделать это с помощью списка понимания:

a = [(0, 1, 2), (3, 4, 5), (6, 7, 8)] 
b = (10, 20, 30) 
c = [[x + b[i] for i, x in enumerate(y)] for y in a] 

c будет список списков, а не список кортежей. Если это имеет значение, то вы можете сделать это вместо того, чтобы:

c = [tuple(x + b[i] for i, x in enumerate(y)) for y in a] 
+0

К сожалению, кто-то уже избил меня. Я буду держать это здесь, чтобы показать способ сделать это с 'enumerate', а не' zip'. – Samadi

+0

ваше решение быстрее в python 2, потому что 'zip' строит список. 'enumerate' не делает. Во всяком случае: хороший ответ. –

+0

@ Jean-FrançoisFabre oh boy, радости Python 2! – Samadi

2

Определим функцию суммировать два вектора:

def sum_vectors(a, b): 
    return tuple(sum(z) for z in zip(a, b)) 

С его помощью можно определить функцию для добавления вектора в список векторов:

def add_vector_to_vectors(v, ws): 
    return [sum_vectors(v, w) for w in ws] 

Пример использования:

>>> a = [(0, 1, 2), (3, 4, 5), (6, 7, 8)] 
>>> b = (10, 20, 30) 
>>> add_vector_to_vectors(b, a) 
[(10, 21, 32), (13, 24, 35), (16, 27, 38)] 
+0

У вас уже есть правильные ответы, но я сохраню свое, так как я нахожу его более читаемым, чтобы разбить его пошагово. – dkasak

Смежные вопросы