2017-06-22 70 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}}