从默认字典创建字典

时间:2015-10-13 07:50:17

标签: python dictionary

我有以下字典列表。

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])

但是dict中的其他条目,我无法得到。 我需要

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

也是。如何完成?

2 个答案:

答案 0 :(得分:0)

密钥在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}}

ok - >

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()))

答案 1 :(得分:0)

不是很诡异,但你可以先将每个重复的条目存储在字典中,然后遍历字典以产生你想要的输出

{{1}}