2015-12-01 2 views
4

У меня есть два списка, и я хотел бы объединить их по одному и тому же заказу.Объединить строки с одинаковыми индексами в двух списках

Ниже приведен вопрос.

A = ['1,2,3','4,5,6','7,8,9'] 
B = ['10','11','12'] 

Чтобы получить новый список, например, как показано ниже

A+B = ['1,2,3,10','4,5,6,11','7,8,9,12'] 

Стараюсь extend, zip, append, enumerate, но не мог получить то, что я хочу. Результат повторяется.

Любой намек или элегантный способ сделать это пожалуйста?

+1

Итак, вы хотите расширить строки, содержащиеся в списке A, со строками второго списка B? – albert

ответ

5

Просто используйте ','.join и zip ..

A = ['1,2,3','4,5,6','7,8,9'] 
B = ['10','11','12'] 

C = [ ','.join(pair) for pair in zip(A,B) ] 
6

A и B списки строк. Используя zip, вы можете создавать пары, такие как ('1,2,3', '10'). Впоследствии вы можете объединить эти две строки, используя join.

A = ['1,2,3','4,5,6','7,8,9'] 
B = ['10','11','12'] 

C = [','.join(z) for z in zip(A, B)] 
print C 
2

Вы, конечно, можете использовать enumerate, хотя zip является более естественным выбором

>>> A = ['1,2,3','4,5,6','7,8,9'] 
>>> B = ['10','11','12'] 
>>> [a + "," + B[i] for i, a in enumerate(A)] 
['1,2,3,10', '4,5,6,11', '7,8,9,12'] 
1

Используя map ... конечно, этот метод не будет создавать какие-либо дополнительные list из tuples как zip ..

>>> A = ['1,2,3','4,5,6','7,8,9'] 
>>> B = ['10','11','12'] 
>>> map(lambda x, y:x + ',' + y, A, B) 
['1,2,3,10', '4,5,6,11', '7,8,9,12'] 
+0

'zip' не создает дополнительный список кортежей в python 3, и если вы действительно волнуетесь, вы можете использовать' izip' в python 2.x из 'itertools'. –

+0

@ChadS. Я имел в виду 'Python2.7' и только' zip' .. и BTW itertools.izip (https://docs.python.org/2/library/itertools.html#itertools.izip) сам использует 'map' –

+0

все в порядке, я бы предпочел использовать 'izip', чем карту + лямбда. –

2

Уже ответил, так вот некоторые развлечения и игры работают, если Должна ли А и Б имеют разную длину -zip оставляет непревзойденное материал:

>>> A = ['1,2,3','4,5,6','7,8,9'] 
>>> B = ['10','11','12'] 

# basic solution using for/len, will except if len(A) > len(B) 
>>> [ A[i] + "," + B[i] for i in range(len(A)) ] 

# complicated solution to deal with a difference in the 
# lengths of A and B 
>>> [ (A[i] if i < len(A) else ',,') + "," + (B[i] if i < len(B) else '') for i in range((len(A) if len(A)>=len(B) else len(B))) ] 
['1,2,3,10', '4,5,6,11', '7,8,9,12'] 

# add something to A, len(A) > len(B) 
>>> A.append('13,14,15') 
>>> [ (A[i] if i < len(A) else ',,') + "," + (B[i] if i < len(B) else '') for i in range((len(A) if len(A)>=len(B) else len(B))) ] 
['1,2,3,10', '4,5,6,11', '7,8,9,12', '13,14,15,'] 

# add a couple of things to B, len(B) > len(A) 
>>> B.append('16') 
>>> B.append('17') 
>>> [ (A[i] if i < len(A) else ',,') + "," + (B[i] if i < len(B) else '') for i in range((len(A) if len(A)>=len(B) else len(B))) ] 
['1,2,3,10', '4,5,6,11', '7,8,9,12', '13,14,15,16', ',,,17'] 
2

Вы также можете mapstr.join после проносясь:

A = ['1,2,3','4,5,6','7,8,9'] 
B = ['10','11','12'] 

from itertools import izip 

print(map(",".join, izip(A, B))) 
['1,2,3,10', '4,5,6,11', '7,8,9,12'] 
2

Как об этом, предполагая, что два списка имеют одинаковую длину:

def concat_lists(l1, l2): 
    concat_list = [] 
    for i in range(len(l1)): 
     concat_list.append(l1[i] + ',' + l2[i]) 
    return concat_list 

Или, используя список понимание вместо:

def concat_lists(l1, l2): 
    return [l1[i] + ',' + l2[i] for i in range(len(l1))] 
Смежные вопросы