2016-04-04 3 views
6

у меня есть два списка одинаковой длиныPython: поэлементно объединение двух списков одинаковой длины

a = [[1,2], [2,3], [3,4]] 
b = [[9], [10,11], [12,13,19,20]] 

и хочет объединить их

c = [[1, 2, 9], [2, 3, 10, 11], [3, 4, 12, 13, 19, 20]] 

Я делаю это

c= [] 
for i in range(0,len(a)): 
    c.append(a[i]+ b[i]) 

Однако я использую R, чтобы избежать циклов, и альтернативы, такие как zip и itertools, не генерируют мой желаемый результат. Есть ли способ сделать это лучше?

EDIT: Спасибо за помощь! Мои списки содержат 300 000 компонентов. Время выполнения решений являются

[a_ + b_ for a_, b_ in zip(a, b)] 
1.59425 seconds 
list(map(operator.add, a, b)) 
2.11901 seconds 
+0

жаль. отредактировал его правильно –

ответ

7

Python имеет встроенный zip функции, я не уверен, как это похоже является R, вы можете использовать его как этот

a_list = [[1,2], [2,3], [3,4]] 
b_list = [[9], [10,11], [12,13]] 
new_list = [a + b for a, b in zip(a_list, b_list)] 

[ ... for ... in ... ] синтаксис называется пониманием списка, если вы хотите узнать больше.

+0

Спасибо. Я дал этому ответу галочку, потому что она была быстрее в моем наборе данных. Как python noob у меня нет другого критерия. –

8
>>> help(map) 
map(...) 
    map(function, sequence[, sequence, ...]) -> list 

    Return a list of the results of applying the function to the items of 
    the argument sequence(s). If more than one sequence is given, the 
    function is called with an argument list consisting of the corresponding 
    item of each sequence, substituting None for missing values when not all 
    sequences have the same length. If the function is None, return a list of 
    the items of the sequence (or a list of tuples if more than one sequence). 

Как вы можете видеть, map(…) может занять несколько итерируемых в качестве аргумента.

>>> import operator 
>>> help(operator.add) 
add(...) 
    add(a, b) -- Same as a + b. 

Итак:

>>> import operator 
>>> map(operator.add, a, b) 
[[1, 2, 9], [2, 3, 10, 11], [3, 4, 12, 13]] 

Пожалуйста, обратите внимание, что в Python 3 map(…) возвращает generator по умолчанию. Если вам нужен произвольный доступ или если вы хотите перебирать результат несколько раз, тогда вам нужно использовать list(map(…)).

0

Вы можете сделать это следующим образом:

>>> [x+b[i] for i,x in enumerate(a)] 
[[1, 2, 9], [2, 3, 10, 11], [3, 4, 12, 13, 19, 20]] 

Чтобы объединить два списка, питон делает это так легко:

mergedlist = listone + listtwo 
+0

Пожалуйста, не просто голосуйте и уходите. Будьте ответственны, добавьте свою причину здесь. – Quinn

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