我有以下字典列表。
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])
也是。如何完成?
答案 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}}