【问题标题】:Find combinations of a list of sets查找集合列表的组合
【发布时间】:2016-10-02 13:50:11
【问题描述】:

我正在使用 python 2.7。给定一个集合列表,是否有任何快速有效的方法来生成组合?输入集在每个集中始终有一项,输出集的长度均为 2

来自:

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

收件人:

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

【问题讨论】:

  • 查看itertools模块
  • 这需要更清楚。你能举一个输入集的长度不都是1的例子吗?输出是否需要按特定顺序排列?为什么输出集的长度都是 2?
  • @AlexHall 对不起。那不是我考虑的一部分。没想到=x。但是,输入集总是在每个集中有一个项目,输出集的长度都是 2。

标签: python python-2.7 set combinations


【解决方案1】:

由于集合列表中的元素都是 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'}]

【讨论】:

  • 谢谢!这正是我想要的。也谢谢你的解释。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-14
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    相关资源
    最近更新 更多