2015-10-13 83 views
1

我有以下字典列表。從默認字典創建字典

new_entries = [] 
new_entries.append({'id':1,'a':1,'b':2}) 
new_entries.append({'id':2,'a':3,'b':2}) 
new_entries.append({'id':3,'a':4,'b':3}) 
new_entries.append({'id':4,'a':5,'b':6}) 
new_entries.append({'id':5,'a':8,'b':9}) 
new_entries.append({'id':6,'a':9,'b':8}) 
new_entries.append({'id':7,'a':1,'b':4}) 
new_entries.append({'id':8,'a':1,'b':2}) 
new_entries.append({'id':9,'a':3,'b':2}) 
new_entries.append({'id':10,'a':6,'b':2}) 
new_entries.append({'id':11,'a':6,'b':2}) 
new_entries.append({'id':12,'a':6,'b':2}) 
new_entries.append({'id':13,'a':7,'b':2}) 
new_entries.append({'id':14,'a':7,'b':2}) 
new_entries.append({'id':15,'a':7,'b':2}) 

而且我想要基於a和b鍵的重複id。手段id 1和id 9與他們的a,b是相同的。同樣也是10,11,12。 所以,我要一本字典出來的,其結構如下

1:set([8]) 
8:set([1]) 
10:set([11,12]) 
11:set([10,12]) 
12:set([10,11]) 

我寫了下面的代碼爲

dummy_store = {} 
dedup_store = defaultdict(set) 

for entry in new_entries: 
    if (entry['a'],entry['b']) in dummy_store: 
     dedup_store[dummy_store[(entry['a'],entry['b'])]].add(entry['id']) 
     continue 
    dummy_store[(entry['a'],entry['b'])] = entry['id'] 

在那之後,我能夠獲得聯想的一端,從而,我dedup_store字典有 1:集([8]) 10:集([11,12])

但在字典中的其他項,我無法得到的。 我需要

8:set([1]) 
11:set([10,12]) 
12:set([10,11]) 

以及。如何做到這一點?

回答

0

鍵得到overriten在dummy_store

像這樣的東西應該工作:

new_entries = [ 
    {'id': 1, 'a': 1, 'b': 2}, 
    {'id': 2, 'a': 3, 'b': 2}, 
    {'id': 3, 'a': 4, 'b': 3}, 
    {'id': 4, 'a': 5, 'b': 6}, 
    {'id': 5, 'a': 8, 'b': 9}, 
    {'id': 6, 'a': 9, 'b': 8}, 
    {'id': 7, 'a': 1, 'b': 4}, 
    {'id': 8, 'a': 1, 'b': 2}, 
    {'id': 9, 'a': 3, 'b': 2}, 
    {'id': 10, 'a': 6, 'b': 2}, 
    {'id': 11, 'a': 6, 'b': 2}, 
    {'id': 12, 'a': 6, 'b': 2}, 
    {'id': 13, 'a': 7, 'b': 2}, 
    {'id': 14, 'a': 7, 'b': 2}, 
    {'id': 15, 'a': 7, 'b': 2}, 
] 

data = {entry['id']: (entry['a'], entry['b']) for entry in new_entries} 

temp = defaultdict(set) 
dedup_store = defaultdict(set) 

for k, v in data.items(): 
    temp[v].add(k) 

for ids in temp.values(): 
    for id in ids: 
     dedup_store[id] = ids.difference({id}) 

In [99]: dict(dedup_store) 
Out[99]: 
{1: {8}, 
2: {9}, 
3: set(), 
4: set(), 
5: set(), 
6: set(), 
7: set(), 
8: {1}, 
9: {2}, 
10: {11, 12}, 
11: {10, 12}, 
12: {10, 11}, 
13: {14, 15}, 
14: {13, 15}, 
15: {13, 14}} 

確定 - >

defaultdict(set, filter(lambda x: x[1], reduce(lambda r, e: r.__setitem__(e['id'], {_e['id'] for _e in new_entries if _e['a'] == e['a'] and _e['b'] == e['b'] and e['id'] != _e['id']}) or r, new_entries, {}).iteritems())) 
+0

我不希望有空集的鍵。如果沒有使用臨時字典,會真的很感激! –

0

不是很pythonish,但你可以先將每個重複條目存儲在一個dic中然後迭代字典以產生你想要的輸出

items = {} 

for item in new_entries: 
    key = str(item["a"]) + "-" + str(item["b"]) 
    if items.has_key(key): 
     items[key].append(item["id"]) 
    else: 
     items[key] = [item["id"]] 


for item in items: 
    if len(items[item]) > 1: 
     for idx, val in enumerate(items[item]): 
      print str(val) + ":set(" + str(items[item][idx + 1:] + (items[item][:idx])) + ")"