2015-09-23 53 views
-1

的兩個序列結合我有兩個列表:如何將數據從字典

list1 = [{'tag':'XXX', 'key1':'a'}, {'tag':'YYY', 'key1':'a'}] 

list2 = [{'tag':'XXX', 'key1':'c'}, {'tag':'ZZZ', 'key1':'d'}] 

我需要建立一個新的列表:

comblist = [{'tag':'XXX', 'key1':'a'}, {'tag':'YYY', 'key1':'a'}, {'tag':'ZZZ', 'key1':'d'}] 

我需要從列表2元素添加到列表1,但只有在list1中關鍵字'tag'的值中不存在關鍵字'tag'的值。

+1

我懷疑詞典列表是最好的數據結構這裏;如果你有一個外部字典映射標籤到內部字典,這將是更容易。 – jonrsharpe

+0

真正的數據來自csv.DictReader對象。接下來他們被重複數據刪除。輸出結構是字典列表。你能給我一個簡單的例子嗎?我的英語不好,我不知道你的意思。 –

回答

3

你可以先創建一組從列表1標籤值,然後使用一個修真通過列表2字典具有新的標籤來擴展列表1:

>>> list1 = [{'tag':'XXX', 'key1':'a'}, {'tag':'YYY', 'key1':'a'}] 
>>> list2 = [{'tag':'XXX', 'key1':'c'}, {'tag':'ZZZ', 'key1':'d'}] 
>>> tags = set(d['tag'] for d in list1) 
>>> list1.extend(d for d in list2 if not d['tag'] in tags) 
>>> list1 
[{'key1': 'a', 'tag': 'XXX'}, {'key1': 'a', 'tag': 'YYY'}, {'key1': 'd', 'tag': 'ZZZ'}] 
+0

非常優雅清晰。 –

0

你可以做到這一點詞典的更簡單的使用更新方法:

dict1 = dict((x['tag'], x['key1']) for x in list1) 
dict2 = dict((x['tag'], x['key1']) for x in list2) 

result = dict2.copy() 
result.update(dict1) 

result = [{'tag': key, 'key1': value} for key, value in result.iteritems()] 
0

所以我建立功能:

def add(seq1, seq2, key=None): 
seen = set() 
#add values from seq1 for selected key (or keys) to seen. 
for item in seq1: 
    seen.add(key(item)) 
# Check if value(s) for selected key(s) is in seen. 
for item in seq2: 
    # if statemant added for support two types of sequences lists end dicts 
    val = item if key is None else key(item) 
    if val not in seen: 
     # Add selected element from seq2 to seq1 and value of key to seen 
     seq1.append(item) 
     seen.add(val) 
return seq1 

,並稱之爲:

comblist = list(add(list1, list2, key=lambda d: d['tag'])) 

它的工作好。 函數適用於不同類型的數據結構和屬性。 我不親,我很好奇。有沒有更簡單或更快的方法? 我的列表包含1500多個字典,每個字典有15個鍵值對。

+5

使你的編輯有問題不作爲回答 – The6thSense

+0

我認爲這*是一個答案(儘管緩慢)的問題問。如果真正的問題是 - 我如何使這個更快或更簡潔,那麼整個答案應該是問題。 –