2017-06-22 104 views
2

我已经构建了一个嵌套的字典,它代表了用计数器赋值的所有组合(笛卡尔积)。删除嵌套字典中隐式嵌套的重复夫妇

夫妇隐含也(G1,G2)是一样的(G2,G1)

这是我为我的结构

counters_in_group = dict((group,0) for group in arr) 
counters = dict((group, dict(counters_in_group)) for group in arr) 
print(counters) 

话说组代码arr = [7272463, 8980365, 7047095]我得到这

{7047095: {7272463: 0, 8980365: 0, 7047095: 0}, 8980365: {7272463: 0, 8980365: 0, 7047095: 0}, 7272463: {7272463: 0, 8980365: 0, 7047095: 0}} 

我想简单地摆脱重复的如此

{7047095: {7272463: 0, 8980365: 0, 7047095: 0}, 8980365: {7272463: 0, 8980365: 0}, 7272463: {7272463: 0}} 

我希望问题很清楚,如果需要,我会尽量澄清。

Thnak提前。

+0

是群体总是整数? –

+0

组是身份证,我可以使用身份证姓名(字符串)代替 –

回答

3

鉴于元素可订购(所以<=关系被定义在这些像intstr,...),你可以使用下面的嵌套字典解析:

{k1:{k2:v2 for k2,v2 in v1.items() if k1 <= k2} for k1,v1 in counters.items()} 

这就造成:

>>> {k1:{k2:v2 for k2,v2 in v1.items() if k1 <= k2} for k1,v1 in counters.items()} 
{7047095: {7272463: 0, 8980365: 0, 7047095: 0}, 8980365: {8980365: 0}, 7272463: {8980365: 0, 7272463: 0}} 

代码的工作原理如下:每对夫妇(g1,g2)我们简单地把值到生成的字典,当且仅当g1 <= g2。这意味着两个副本中的一个被添加,一个被删除。

+0

非常聪明,我会将它标记为解决方案,因为我很匆忙,并在以后查看它的天才。 –

+0

我刚刚将<用<=替换为包含(val1,val1)s –

+0

@ bacloud14:我注意到组合也可以用相同的元素构造。我编辑了答案。 –

3
>>> {k: dict.fromkeys(arr[i:], 0) for i, k in enumerate(arr)} 
{7047095: {7047095: 0}, 8980365: {8980365: 0, 7047095: 0}, 7272463: {7047095: 0, 8980365: 0, 7272463: 0}} 

>>> {k1: {k2: 0 for k2 in arr[i:]} for i, k1 in enumerate(arr)} 
{7047095: {7047095: 0}, 8980365: {8980365: 0, 7047095: 0}, 7272463: {7047095: 0, 8980365: 0, 7272463: 0}}