2013-07-30 79 views
1

假設我有任何兩個列表,但相等的長度,例如:在python3結合兩個列表

['a','b','c','d'] 
['r','t','y','h'] 

對於這兩個列表,我想輸出是:

'ar', 'bt', 'cy', 'dh' 

基本上,第一個列表的第一個元素到第二個列表的第一個元素,等等。我會怎麼做?請注意,列表可以是任意長度,而不僅僅是示例所示,但第一個列表的長度等於第二個列表的長度。

回答

5

zip的名單,他們每對字符串的結合,然後join成一個字符串:

>>> list1 = ['a','b','c','d'] 
>>> list2 = ['r','t','y','h'] 
>>> [''.join(pair) for pair in zip(list1, list2)] 
['ar', 'bt', 'cy', 'dh'] 
1

您可以使用mapzip做的工作:

>>> l1=['a','b','c','d'] 
>>> l2=['r','t','y','h'] 
>>> map(lambda(x,y): x+y, zip(l1,l2)) 
['ar', 'bt', 'cy', 'dh'] 

zip做些什麼它創建了一個元組列表,其中第i個元組包含每個列表中的第i個元素。然後你可以通過連接把每個元組轉換成一個字符串(使用lambda(x,y): x+y)。

+1

不幸的是,語法將不再在Python 3中工作 - 'lambda(x,y):x + y',我的意思是。 – DSM

+0

列表理解通常被認爲比'lambda'上的'map'更加Pythonic。除了語法問題之外,你還需要在Python 3中調用'list'來封裝它,因爲'map'是懶惰的。我的解決方案還具有擴展以處理任意數量的輸入列表的優點,因爲它使用「join」。 – agf

1

如果你想有一個功能性的方法,你可以使用mapoperator.add

import operator 
map(operator.add,['a','b','c','d'], ['r','t','y','h']) 
>>>['ar', 'bt', 'cy', 'dh'] 

無需lambdas也不列表理解做串聯。

注:對於那些誰說是不是Python 3裏,這種轉儲可以使你改變主意:

Python 3.1.3 (r313:86834, Nov 28 2010, 10:01:07) 
[GCC 4.4.5] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import operator 
>>> list(map(operator.add, ['a','b'],['r','t'])) 
['ar', 'bt'] 
+0

那不是Python3:p –

+0

或者如果你想概括,使用'''.join'。此外,列表解析功能。 – agf

+0

@gnibbler我在你的評論後更新了這個問題:P –

0

這裏有一些更多的方法來做到這一點

>>> list1 = ['a','b','c','d'] 
>>> list2 = ['r','t','y','h'] 

>>> [x + y for x, y in zip(list1, list2)] 
['ar', 'bt', 'cy', 'dh'] 

>>> it = iter(list2) 
>>> [x + next(it) for x in list1] 
['ar', 'bt', 'cy', 'dh'] 
1

以上答案似乎也適用於Python 2.7。此外,還可以只使用拉鍊和內聯加法器(拉姆達):

1:

list1 = ['a','b','c','d'] 

list2 = ['r','t','y','h'] 

add = lambda pair:pair[0]+pair[1] 

print [add(pair) for pair in zip(list1, list2)] 

2:

或只是在一行:

print map(lambda pair:pair[0]+pair[1],[pair for pair in zip(list1,list2)]) 

3:

map()允許映射多個參數,這產生了一個簡短的解決方案:

print map(lambda x,y:x+y, list1, list2)