2010-03-09 89 views
181

什麼是Pythonic方法來實現以下目標?如何將列表合併到元組列表中?

# Original lists: 

list_a = [1, 2, 3, 4] 
list_b = [5, 6, 7, 8] 

# List of tuples from 'list_a' and 'list_b': 

list_c = [(1,5), (2,6), (3,7), (4,8)] 

list_c每個成員是一個元組,其第一構件是從list_a,第二個是從list_b

回答

258
>>> list_a = [1, 2, 3, 4] 
>>> list_b = [5, 6, 7, 8] 
>>> zip(list_a, list_b) 
[(1, 5), (2, 6), (3, 7), (4, 8)] 
+56

你必須知道的是,拉鍊功能在最短列表的末尾,這可能不總是你想要停止。 'itertools'模塊定義了一個'zip_longest()'方法,該方法在最長列表的末尾停止,用你提供的參數填充缺失的值。 – 2010-03-09 10:05:48

+5

@Adrien:歡呼您的適用評論。對於Python 2.x,s/zip_longest()/ izip_longest()'。在Python 3.x中重命名爲'zip_longest()'。 – bernie 2011-07-10 19:13:44

+0

可以使用zip命令創建[(1,5),(1,6),(1,7),(1,8),(2,5),(2,6)等等]嗎? – 2016-05-30 04:39:57

87

在python 3.0 zip中返回一個zip對象。您可以致電list(zip(a, b))以獲取清單。

3

我知道這是一個老問題,已經回答了,但由於某種原因,我仍然想發佈這個替代解決方案。我知道很容易找到哪個內置函數可以做到你需要的「魔法」,但是知道自己可以做到這一點並沒有什麼壞處。

>>> list_1 = ['Ace', 'King'] 
>>> list_2 = ['Spades', 'Clubs', 'Diamonds'] 
>>> deck = [] 
>>> for i in range(max((len(list_1),len(list_2)))): 
     while True: 
      try: 
       card = (list_1[i],list_2[i]) 
      except IndexError: 
       if len(list_1)>len(list_2): 
        list_2.append('') 
        card = (list_1[i],list_2[i]) 
       elif len(list_1)<len(list_2): 
        list_1.append('') 
        card = (list_1[i], list_2[i]) 
       continue 
      deck.append(card) 
      break 
>>> 
>>> #and the result should be: 
>>> print deck 
>>> [('Ace', 'Spades'), ('King', 'Clubs'), ('', 'Diamonds')] 
+2

更改其中一個輸入列表(如果它們的長度不同)並不是一個好的副作用。另外,在'if-elif'中兩個'card'的分配是不需要的,這就是爲什麼你有'continue'。 (事實上​​,如果沒有「繼續」,你不需要改變列表:之前提到的任務都應該保留下來,成爲'card =(list_1 [i],'')'和'card =('', list_2 [1])')。 – 2017-01-07 15:01:13

6

您可以使用地圖拉姆達

a = [2,3,4] 
b = [5,6,7] 
c = map(lambda x,y:(x,y),a,b) 

這也將工作,如果有原始列表的長度不匹配

+1

爲什麼使用lambda? 'map(None,a,b)' – 2016-06-08 00:19:14

+0

沒有人會拋出一個錯誤,因爲它不可調用。 – 2016-07-10 14:55:19

+0

你試過了嗎? – 2016-07-10 15:54:44

4

您的問題聲明顯示輸出不是元組,但名單

list_c = [(1,5), (2,6), (3,7), (4,8)] 

支票

type(list_c) 

考慮你想要的結果作爲元組進行list_a和list_b的,做

tuple(zip(list_a,list_b)) 
+0

從我的角度來看,它似乎是我正在尋找和正確工作(列表和元組)。因爲當你使用** print **時,你會看到正確的值(正如預期的一樣,由@cyborg和@Lodewijk提及)並且與**對象**沒有任何關係,例如:'<0x000001F266DCE5C0的映射對象>或'<0x000002629D204C88>的zip對象''。至少,關於** map **和** zip **(單獨)的解決方案對我來說似乎不完整(或太複雜)。 – 2017-05-28 01:40:34

相關問題