【问题标题】:Get all unique combinations from list of permutations从排列列表中获取所有唯一组合
【发布时间】:2015-07-15 12:38:43
【问题描述】:

TL/DR

给定X = {(A,B),(B,C),(D,E),(B,A),(C,B)}(其中Xset

如何过滤显示唯一组合(而不是唯一排列)的子元组,使得X 变为 {(A,B),(B,C),(D,E))}

更长的形式

这里的大多数组合/排列问题有点反问题。

我有一组元组(外元组),其中每个元组有2个元素,这两个元素也是元组(内元组),每个子元组有两个元素,都是整数。

例如,包含三个元素的集合可能看起来像

X = { ( (1,2),(2,3) ), ( (1,3),(1,2) ), ( (2,3),(1,2) ) }

虽然所有外部元组都是唯一的,但我想构建一个子集,其中包含一组 unqiue 元组,其中两个内部元组的 ORDER 是不相关的(即一组唯一组合)。在上面的示例中,这将减少为;

X = { ( (1,2),(2,3) ), ( (1,3),(1,2) )}

因为

( (1, 2),(2,3) ) and ( (2,3),(1,2) ) )

都是(1, 2)(2,3) 的组合。

有明显的蛮力/for-loop 方法可以解决这个问题,但感觉不是很 Pythonic。

也许利用itertoolsmap

【问题讨论】:

  • X = {(A,B),(B,C),(D,E),(B,A),(C,B))} 不是有效语法
  • @Sudipta X = { ( (1,2),(2,3) ), ( (1,3),(1,2) ), ( (2,3)(1,2) ) }
  • @Sudipta - 对不起,一个额外的 ')' 偷偷溜进去(更正)

标签: python combinations permutation itertools


【解决方案1】:

您可以使用 map 对您的元素应用 sorted 函数,然后使用集合推导式获取唯一元素:

>>> new={tuple(i) for i in map(sorted,X)}
>>> new
set([('B', 'C'), ('A', 'B'), ('D', 'E')])

但请注意,由于 sorted 将您的元素转换为列表,您需要将它们反转为 tuple,因为列表不可散列。

【讨论】:

  • 很好——你自己和@RemcoGerlich 相隔几秒钟就提出了相同的解决方案——显然,一旦你在内部订购了子元组,其他一切都是微不足道的,但我还没有实现这一飞跃。非常感谢。
【解决方案2】:

一种方法是对元组进行排序,然后创建一个新集合。 (A, B) 和 (B, A) 都将被排序到 (A, B),因此只出现一次。

def to_sorted(t):
    return tuple(sorted(t))

Xnew = {to_sorted(t) for t in X}

另一个是根本不使用元组——元组是有序的,你不关心顺序。你可以使用套装。 frozensets 是不可变的集合,可以是其他集合的元素:

Xnew = {frozenset(t) for t in X}

我更喜欢这个,但是 1) 如果你的元组包含多个,它就不起作用,并且 2) 现在你有 freezesets 而不是元组,你的其他代码可能需要更改。

【讨论】:

  • 我不知道frozensets - 实际上,它们可能对其余代码也更有意义......干杯。
【解决方案3】:

进一步简化了一步(掉落地图):

new = {tuple(sorted(n)) for n in X}

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多