2010-02-11 34 views
4

在我的工作中我使用了很多維恩圖,到目前爲止,我一直依靠基於網絡的「Venny」。這提供了很好的選項來導出各種交叉點(即僅屬於該特定交叉點的元素)。此外,它最多可以繪製4個列表。維恩圖最多4列表 - 輸出交集和獨特集

問題是,使用大型列表(4K +元素)和超過3套做這件事是一件雜事(複製,粘貼,保存...)。因此,我決定專注於自己生成列表並將其用於繪圖。

這段冗長的介紹導致了問題的癥結所在。給定3或4個部分包含相同元素的列表,我如何在Python中處理它們以獲得如Venn圖上所示的各種集合(唯一的,共同的4,常見於第一和第二等...)(3 list graphical example4 list graphical example)? 3列表看起來不難,但4列表有些複雜。

+0

你需要顯示它的圖形? – Khelben 2010-02-11 10:57:17

+0

生成數據和工會很容易使用'set' – Khelben 2010-02-11 10:57:52

+0

我不需要圖形,因爲Venny對我來說很容易,我只想提取列表。 – Einar 2010-02-11 14:45:34

回答

6

假設你有蟒蛇2.6或更高:

>>> from itertools import combinations 
>>> 
>>> data = dict(
... list1 = set(list("alphabet")), 
... list2 = set(list("fiddlesticks")), 
... list3 = set(list("geography")), 
... list4 = set(list("bovinespongiformencephalopathy")), 
...) 
>>> 
>>> variations = {} 
>>> for i in range(len(data)): 
... for v in combinations(data.keys(),i+1): 
...  vsets = [ data[x] for x in v ] 
...  variations[tuple(sorted(v))] = reduce(lambda x,y: x.intersection(y), vsets) 
... 
>>> for k,v in sorted(variations.items(),key=lambda x: (len(x[0]),x[0])): 
... print "%r\n\t%r" % (k,v) 
... 
('list1',) 
     set(['a', 'b', 'e', 'h', 'l', 'p', 't']) 
('list2',) 
     set(['c', 'e', 'd', 'f', 'i', 'k', 'l', 's', 't']) 
('list3',) 
     set(['a', 'e', 'g', 'h', 'o', 'p', 'r', 'y']) 
('list4',) 
     set(['a', 'c', 'b', 'e', 'g', 'f', 'i', 'h', 'm', 'l', 'o', 'n', 'p', 's', 'r', 't', 'v', 'y']) 
('list1', 'list2') 
     set(['e', 'l', 't']) 
('list1', 'list3') 
     set(['a', 'h', 'e', 'p']) 
('list1', 'list4') 
     set(['a', 'b', 'e', 'h', 'l', 'p', 't']) 
('list2', 'list3') 
     set(['e']) 
('list2', 'list4') 
     set(['c', 'e', 'f', 'i', 'l', 's', 't']) 
('list3', 'list4') 
     set(['a', 'e', 'g', 'h', 'o', 'p', 'r', 'y']) 
('list1', 'list2', 'list3') 
     set(['e']) 
('list1', 'list2', 'list4') 
     set(['e', 'l', 't']) 
('list1', 'list3', 'list4') 
     set(['a', 'h', 'e', 'p']) 
('list2', 'list3', 'list4') 
     set(['e']) 
('list1', 'list2', 'list3', 'list4') 
     set(['e']) 
+0

謝謝,這是訣竅。 – Einar 2010-02-11 14:54:00