2015-12-04 111 views
1

兩個名單上有元組的兩個列表:比較/測試元組

L1 = [(192.168.1.1, name1), (192.168.1.2, name2), (192.168.1.3, name3), (192.168.1.4, name4)] 

L2 = [(192.168.1.1, data1, data2), (192.168.1.2, data3, data4)] 

L1有可能發生的,而L2當前有活動的IP和數據的所有可能的IP /名稱。

我的目標是得到一個列表,我們稱之爲L3,它需要在L1中具有ip和名稱,而來自L2的數據對於L2中的所有元素。

L3 = [(192.168.1.1, name1, data1, data2), (192.168.1.2, name2, data3, data4)] 

解決方法我放棄列表理解後覺得很骯髒,可能很慢。我還沒有在更大的數據集上進行測試,但速度會很重要,所以我需要你們的幫助。我希望通過列表理解速度和爲了學習新事物而做到這一點。提前致謝。

我骯髒的解決方案:

L3=[] 
for item in L1: 
for i in range(len(L2)): 
    if L2[i][0] == item[0]: 
     L3.append((item[0], item[1], L2[i][1], L2[i][2])) 

回答

4

使用列表理解。

>>> L1 = [('192.168.1.1', 'foo'), ('192.168.1.2', 'bar'), ('192.168.1.3', 'buzz')] 
>>> L2 = [('192.168.1.1', 'data1', 'data2'), ('192.168.1.2', 'data3', 'data4')] 
>>> [j + i[1:] for i in L2 for j in L1 if j[0] == i[0]] 
[('192.168.1.1', 'foo', 'data1', 'data2'), ('192.168.1.2', 'bar', 'data3', 'data4')] 
+0

你是上帝,謝謝。正是我所需要的 – Notoc

+1

@ user2004212:如果答案有幫助,請記住接受它。 –

+0

@ user2004212不,我不是上帝。我是忍者戰士:-) –