2014-03-27 56 views
1

我有一個匹配python列表的問題。匹配列表並將結果寫入新列表

list1 = [["id1","string1","string2"],["id2","string3","string4"]] 
list2 = [["id1","string1","string2", "string3"],["id3","string4","string5", "string6"]] 

我想是這樣的

list3 = [["id1", "string1", "string2", "string3"],["id2","string3","string4"],["id3","string4","string5", "string6"]] 

如果從列表1的ID在列表2然後寫從列表2(例如["id1","string1","string2"])到一個新的列表中的元素。如果它不在列表中,則從list1中獲取元素並將其寫入新列表。在最終的結果應該是這個樣子

我嘗試了這種方式

for p in list1: 
    for d in list2: 
     if ((p[0] in list2)): 
      list3.append(d) 
      next 
     else: 
      list3.append(p) 
+0

到底是什麼原因呢? – msvalkon

+0

請證明您至少已完成一些代碼並顯示您在哪裏掙扎 – sshashank124

+0

輸出中元素的順序是否重要? – thefourtheye

回答

2

如果順序並不重要,那麼最好的辦法是將它們轉換爲字典,這樣

它們匹配
dict1 = {item[0]: item for item in list1} 
dict2 = {item[0]: item for item in list2} 
print [dict2.get(item, dict1.get(item)) for item in dict1.viewkeys() | dict2] 

輸出

[['id2', 'string3', 'string4'], 
['id3', 'string4', 'string5', 'string6'], 
['id1', 'string1', 'string2', 'string3']] 

如果您正在使用Python 3.x中,然後用dict.keys代替dict.viewkeys,這樣

print([dict2.get(item, dict1.get(item)) for item in dict1.keys() | dict2]) 

同樣可以這樣寫

[dict2.get(item) or dict1.get(item) for item in dict1.keys() | dict2] 
+0

按位運算符在這裏工作如何? PS。確定,得到它,設置算法查看 –

+0

@ m.wasowski當它與設置像對象一起使用時,它作爲設置聯合操作符:) – thefourtheye

+0

是啊,剛剛得到它,但謝謝你提醒我它存在;) –

2

這是更好地你的列表轉化爲類型的字典,這很容易做的工作,比如:

In [259]: list1 = [["id1","string1","string2"],["id2","string3","string4"]] 

In [260]: {i[0]:i[1:] for i in list1} 
Out[260]: {'id1': ['string1', 'string2'], 'id2': ['string3', 'string4']} 

那麼您可以檢查是否在第一字典的鍵(即你的id S)是在第二字典:

In [270]: d1 = {i[0]:i[1:] for i in list1} 

In [271]: d2 = {i[0]:i[1:] for i in list2} 

In [272]: d1.update(d2) 

In [273]: d1 
Out[273]: 
{'id1': ['string1', 'string2', 'string3'], 
'id2': ['string3', 'string4'], 
'id3': ['string4', 'string5', 'string6']} 

如果你想將其轉換回無論如何要列出:

In [275]: [[k]+d1[k] for k in d1] 
Out[275]: 
[['id2', 'string3', 'string4'], 
['id3', 'string4', 'string5', 'string6'], 
['id1', 'string1', 'string2', 'string3']] 
相關問題