我正在使用python 2.7。給定一組列表,是否有快速有效的方法來生成組合?輸入設置總是在每一組輸出集合中的一個項目都有2
長度:查找組合列表
[set(['item1']), set(['item2']), set(['item3'])]
要:
[set(['item1','item2']), set(['item2','item3']), set(['item3','item1'])]
我正在使用python 2.7。給定一組列表,是否有快速有效的方法來生成組合?輸入設置總是在每一組輸出集合中的一個項目都有2
長度:查找組合列表
[set(['item1']), set(['item2']), set(['item3'])]
要:
[set(['item1','item2']), set(['item2','item3']), set(['item3','item1'])]
由於您的集列表中的元素所有的1元素集合,你正在尋找的組合只是這些集合的2元素子集合。您可以獲取他們是這樣的:
>>> import itertools
>>> sets = [set(['item1']), set(['item2']), set(['item3'])]
>>> elements = set()
>>> for s in sets: elements.update(s)
從而
>>> elements
{'item1', 'item2', 'item3'}
接着,就這樣:
>>> pairs = [set(combo) for combo in itertools.combinations(elements,2)]
>>> pairs
[{'item1', 'item2'}, {'item1', 'item3'}, {'item2', 'item3'}]
謝謝!這完全想要我想要的。感謝您的解釋。 – ysj
正如約翰指出itertools
可能會有所幫助。這裏有一個簡單的例子:
import itertools as it
sets = [set(range(0, 3)), set(range(2, 5)), set(range(4, 7))]
comb = list(it.combinations(sets, r=2))
comb
輸出:[({0, 1, 2}, {2, 3, 4}), ({0, 1, 2}, {4, 5, 6}), ({2, 3, 4}, {4, 5, 6})]
然後創建在每個迭代的交集:
comb_sets = [a.intersection(b) for a, b in comb]
comb_sets
輸出:[{2}, set(), {4}]
看看'itertools'模塊 –
這需要一個更加清晰。你能舉一個例子,其中輸入集不全都是長度爲1的嗎?輸出是否需要按照特定順序進行?爲什麼輸出集都有長度2? –
@AlexHall對不起。這不是我考慮的一部分。從未想過那= x。但是,輸入集合總是有一個項目在每個集合和輸出集合都有長度爲2. – ysj