如果簡化問題,以長度爲2的唯一簇(即,對字典的)變得略微更清晰:從給定的迭代生成固定長度的子序列是完全相同的itertools.combinations作業:
>>> list(itertools.combinations(d, 2))
[('g5', 'g4'), ('g5', 'g3'), ('g5', 'g2'), ('g5', 'g1'), ('g4', 'g3'), ('g4', 'g
2'), ('g4', 'g1'), ('g3', 'g2'), ('g3', 'g1'), ('g2', 'g1')]
我們可以通過實現該視圖運行起來也()的行爲類似於看到任何字典的共同點的密鑰的數目設置(在Python 3中;在Python 2中,它可能是一個li ST):
>>> d['g1'].keys() & d['g2'].keys()
{'p3', 'p1', 'p4'}
&是交集操作 - 它爲我們提供了一組這些集合有共同的所有物品。因此,我們可以檢查是否有ATLEAST其中兩個通過檢查這一套,這讓我們的長度:
>>> common_pairs = [[x,y] for x,y in itertools.combinations(d, 2)
if len(d[x].keys() & d[y].keys()) >= 2]
>>> common_pairs
[['g2', 'g1']]
求解未知的簇大小是有點困難 - 我們不能直接使用,如果在&操作我們並沒有對此進行硬編碼。值得慶幸的是,set類爲我們提供了一種以set.intersection的形式進行交集的方法。它不會接受dict_keys實例,但你可以很容易地解決這個問題通過調用設置:
>>> set.intersection(d['g1'].keys(), d['g2'].keys(), d['g5'].keys())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: descriptor 'intersection' requires a 'set' object but received a 'dict_keys'
>>> set.intersection(set(d['g1']), set(d['g1']), set(d['g5']))
{'p1'}
您應該能夠通過ň相當平凡概括這個大小2的聚集。
作業?你有什麼嘗試? – unholysampler 2011-05-31 21:04:14
不是作業;)我現在如何在for循環中爲key對做這件事,但卻不知道如何在全局範圍內做到這一點 - 全是反對所有。 – 2011-05-31 21:14:33