2016-10-02 110 views
1

我正在使用python 2.7。给定一组列表,是否有快速有效的方法来生成组合?输入设置总是在每一组输出集合中的一个项目都有2

长度:查找组合列表

[set(['item1']), set(['item2']), set(['item3'])] 

要:

[set(['item1','item2']), set(['item2','item3']), set(['item3','item1'])] 
+1

看看'itertools'模块 –

+3

这需要一个更加清晰。你能举一个例子,其中输入集不全都是长度为1的吗?输出是否需要按照特定顺序进行?为什么输出集都有长度2? –

+0

@AlexHall对不起。这不是我考虑的一部分。从未想过那= x。但是,输入集合总是有一个项目在每个集合和输出集合都有长度为2. – ysj

回答

3

由于您的集列表中的元素所有的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'}] 
+0

谢谢!这完全想要我想要的。感谢您的解释。 – ysj

1

正如约翰指出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}]