2017-06-09 107 views
4

我有兩個列表:合併兩個多維列出一個列表中在Python

a_list = 
[['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21].......] 

b_list = 
[['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79].......] 

我需要合併a_listb_list所以它變成了:

combined_list = 
[['2017-06-03 23:01:49', 0, 100,01], ['2017-06-03 23:02:49', 712.32, 50.01], ['2017-06-03 23:03:49', 501.21, 521.79].......] 

我將如何實現這一目標?

回答

0

下面的代碼應該可以工作。這個想法是,你想獲取一個列表a,並創建一個字典,並在a的每個子列表中將鍵設置爲第一個元素。與該列表關聯的值是包含a子列表中第二個元素的列表。然後我們循環第二個列表b並執行相同操作。最後,我們遍歷我們創建的字典D,並將其轉換爲列表。

a = [[1,2], [3,4], [5,6]] 
b = [[1,20],[3,40],[5, 50]] 
D = {} 
for i in a: 
    D[i[0]] = [i[1]] 

for i in b: 
    D[i[0]].append(i[1]) 

finalList = [] 
for d in D: 
    finalList.append([d, D[d][0], D[d][1]]) 

print(finalList) 
>>> [[1, 2, 10], [3, 4, 40], [5, 6, 50]] 

注意,這個程序假定兩個相應的子列表保證有相等的第一個元素。如果情況並非如此,或者兩個列表ab不相等,則需要在line 8上使用if語句來檢查鍵值i[0]是否在列表中。

1

試試這個,合併兩個列表,然後使用defaultdict產生新dictioanry,找到相同的密鑰,追加到super_dict值,然後將其轉換字典列出格式:

import collections 
a_list = [['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21]] 
b_list = [['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79]] 
super_dict = collections.defaultdict(list) 

for e in a_list+b_list: 
    super_dict[e[0]].append(e[1]) 

dictlist=list() 
for key, value in super_dict.iteritems(): 
    dictlist.append([key]+value) 
dictlist 

輸出:

[['2017-06-03 23:02:49', 712.32, 50.01], 
['2017-06-03 23:03:49', 501.21, 521.79], 
['2017-06-03 23:01:49', 0, 100.01]] 
+0

爲了獲得慾望輸出,你可以做'[key] + value',這也允許把它放在列表理解中 – Copperfield

2
a_list = [['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21]] 
b_list = [['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79]] 

假設a_listb_list具有相同的長度,並且假定在兩個列表中每個項目的第一子項總是相同的,如爲真根據你的例子,解決方案是一個單線程。

>>> [a + [b[1]] for (a, b) in zip(a_list, b_list)] 
[[['2017-06-03 23:01:49', 0, 100.01]], [['2017-06-03 23:02:49', 712.32, 50.01]], [['2017-06-03 23:03:49', 501.21, 521.79]]] 
+0

非常感謝@A-B-B,這個工作。但是,如果我有像這樣添加第三個列表:c_list = [['2017-06-03 23:01:49',1。5],['2017-06-03 23:02:49',10.3],['2017-06-03 23:03:49',11.1]]。我在[zip](a_list,b_list,c_list)中爲[a,b,c)[a + [b [1] + [c [1]]]。我收到錯誤消息'zip參數#3必須支持迭代'。我在這裏做錯了什麼?謝謝! – coding

+0

@coding在zip(a_list,b_list,c_list)]中使用[a + [b [1]] + [c [1]]作爲(a,b,c)。這對我有效。確保'c_list'是一個像'a_list'和'b_list'這樣的列表。爲了理解'zip'的工作原理,試試'list(zip(range(5,10),range(10,15),range(15,20)))''。 –

0

只是扔我試圖在混合:

list1 = [["a","b"],["c","d"]] 
list2 = [["a","1"],["c","2"]] 
list3 = [(sub + [list2[i][-1]]) for i, sub in enumerate(list1)] 
#[['a', 'b', '1'], ['c', 'd', '2']] 

這是相當接近@ A-B-B的但如果拉鍊採用枚舉。

+0

這不能正常工作,嘗試例如'list2 = [[「a」,「11」],[「c」,「22」]] – Copperfield

2

您可以使用zip(),用list comprehension像這樣的例子一直解壓數據:

a = [['2017-06-03 23:01:49', 0], 
['2017-06-03 23:02:49', 712.32], 
['2017-06-03 23:03:49', 501.21]] 

b = [['2017-06-03 23:01:49', 100.01], 
['2017-06-03 23:02:49', 50.01], 
['2017-06-03 23:03:49', 521.79]] 

final = [[k,v,j] for (k,v),(_,j) in zip(a, b)] 
print(final) 

輸出:

[['2017-06-03 23:01:49', 0, 100.01], 
['2017-06-03 23:02:49', 712.32, 50.01], 
['2017-06-03 23:03:49', 501.21, 521.79]] 
0
a_list = [['2017-06-03 23:01:49', 0], ['2017-06-03 23:02:49', 712.32], ['2017-06-03 23:03:49', 501.21]] 

b_list = [['2017-06-03 23:01:49', 100.01], ['2017-06-03 23:02:49', 50.01], ['2017-06-03 23:03:49', 521.79]] 

combined_list = [] 
for index in range(3): 
    x = a_list[index] + b_list[index] 
    x.pop(2) 
    combined_list.append(x) 
print(combined_list)  
+0

我使用循環索引和用途的想法的彈出功能刪除出現不止一次的項目。代碼給出了你想要的 – joshua

0

如果你正在尋找一個襯墊,然後我想我會試試看,

[set(item[0]).union(item[1]) for item in list(zip(a_list, b_list))] 
>>>[{0, 100.01000000000001, '2017-06-03 23:01:49'}, {'2017-06-03 23:02:49', 50.009999999999998, 712.32000000000005}, {521.78999999999996, 501.20999999999998, '2017-06-03 23:03:49'}] 
>>> 

結果雖然是一個集合。不會有任何重複的元素。