2015-03-13 69 views
3

什麼是達到以下的最Python的方式:合併兩個列表項到元組的列表中還包含指數

list_a = ["A", "B", "C"] 
list_b = ["X", "Y", "Z"] 

idx_start = 100 

result = [ (100, "A", "X"), (101, "B", "Y"), (102, "C", "Z") ] 

名單保證是同樣大小的。

+0

難道如果你的'result'好嗎是一個帶有元組值的字典嗎? '結果= {100 :('A','X'),101 :('B','Y'),102 :('C','Z')}' – MikeVaughan 2015-03-13 14:46:11

+0

是的,那也可以。 – montonero 2015-03-13 14:47:36

回答

3
from itertools import count 
zip(count(idx_start), list_a, list_b) 
+0

謝謝,這是我一直在尋找 - 非常優雅。 – montonero 2015-03-13 14:56:00

+0

即使兩個列表的大小不一樣,它也可以工作。一旦最短的清單用盡,它就會停止。 – mkrieger1 2015-03-13 14:56:42

3

你可以嘗試列表比較

>>> list_a = ["A", "B", "C"] 
>>> list_b = ["X", "Y", "Z"] 
>>> idx_start = 100 
>>> [(idx_start+i,list_a[i],list_b[i]) for i in range(len(list_a))] 
[(100, 'A', 'X'), (101, 'B', 'Y'), (102, 'C', 'Z')] 

其他方式包括

  • [(idx_start+i,list_a[i],list_b[i]) for i,v in enumerate(list_a)]
2

郵編也是一種選擇

zip(range(idx_start,idx_start+len(list_a)), list_a, list_b) 
+0

我同意。我也使用了zip,但是使用了不太精細的枚舉。 – 2015-03-13 14:53:25

1

我們Ë列表理解:

[(i + start, a, b) for i, (a, b) in enumerate(zip(list_a, list_b))] 
+2

另外,這種變化呢? '[(i,a,b)for i,(a,b)in enumerate(zip(list_a,list_b),idx_start)]'可能會更清楚些。 – 2015-03-13 14:55:56

0

我使用的HashSet有同樣的問題。 我所做的是在for循環中添加一個var實例,並在HashSet中添加索引和兩個值。 邏輯的東西這樣的:

for (int i=0; i<a.length(); i++) { 
    result.add(i,list_a[i],list_b[i]); 
} 
+0

你意識到這是一個Python問題,對吧? – 2015-03-13 14:56:15

+0

邏輯不會改變... – Ade 2015-03-13 14:59:19

0

既然你接受了,你的結果可能是一個字典(或列表)與元組值,試試這個:

>>> list_a = ['A', 'B', 'C'] 
>>> list_b = ['X', 'Y', 'Z'] 
>>> idx_start = 100 
>>> 
>>> result_list = list(enumerate(zip(list_a, list_b), start=idx_start)) 
>>> result_dict = dict(enumerate(zip(list_a, list_b), start=idx_start)) 
>>> 
>>> print (result_list) 
[(100, ('A', 'X')), (101, ('B', 'Y')), (102, ('C', 'Z'))] 
>>> print (result_dict) 
{100: ('A', 'X'), 101: ('B', 'Y'), 102: ('C', 'Z')} 
相關問題