【问题标题】:Assign a unique integer to all combinations of ordered non-repeated elements为有序非重复元素的所有组合分配一个唯一整数
【发布时间】:2021-09-07 22:05:06
【问题描述】:

考虑以下列表:

elems = ('banana', 'apple', 'orange', 'melon')

我需要定义一个函数,为一到三个非重复元素的每个有序组合分配一个唯一整数。例如:

banana                --> 1
banana, apple         --> 2
banana, orange        --> 3
banana, melon         --> 4
banana, apple, orange --> 5
banana, apple, melon  --> 6
banana, orange, apple --> 7
banana, orange, melon --> 8
banana, melon, apple  --> 9
banana, melon, orange --> 10
apple                 --> 11
apple, banana         --> 12
apple, orange         --> 13
...

我的实际列表包含 20 多个元素,因此无法手动定义整组组合。该函数将输入最少一个和最多三个元素,并按照上述约定返回与它们关联的唯一整数。

我一直在玩 itertools.combinations()itertools.combinations_with_replacement(),但它们没有返回我需要的东西。

【问题讨论】:

  • itertools 函数只有在您遍历所有组合/排列/等时才会有所帮助。对于您正在做的事情,您需要根据值确定索引。我只是做数学。首先确定有多少个一、二、三元素序列。然后,根据元素的数量,将先前的计数添加为偏移量。这将问题减少到处理固定数量的元素。然后做同样的事情:确定第一个元素的索引,然后确定需要跳过的数字,等等。有点繁琐,但是很简单。
  • 你能分享一下你目前尝试过的代码吗?
  • “告诉我如何解决这个编码问题”是off-topic for Stack Overflow。您应该发送honest attempt at the solution,然后然后在必要时询问有关它的具体问题。
  • 我也想过这个问题,Tom,我只是希望 ìtertools 中已经有一个简单的方法。谢谢!

标签: python combinations


【解决方案1】:

好吧,给定元素的幂集,例如从这个问题的答案:

How to get all subsets of a set? (powerset)

看起来你想要的是幂集元素的所有排列,对吧?

list(enumerate([p for s in powerset(elems) for p in permutations(s)]))
# => [(0, ()), (1, ('banana',)), (2, ('apple',)), (3, ('orange',)), 
(4, ('melon',)), (5, ('banana', 'apple')), (6, ('apple', 'banana')), 
(7, ('banana', 'orange')), (8, ('orange', 'banana')), 
(9, ('banana', 'melon')), (10, ('melon', 'banana')),
(11, ('apple', 'orange')), (12, ('orange', 'apple')), 
(13, ('apple', 'melon')), (14, ('melon', 'apple')), 
(15, ('orange', 'melon')), (16, ('melon', 'orange')), 
(17, ('banana', 'apple', 'orange')), [...] 
(64, ('melon', 'orange', 'apple', 'banana'))]

您可以在枚举之前运行它通过sorted 以不同的顺序获取它们;如果没有自定义键或比较函数,它将对序列进行排序,以使所有以apple 开头的序列排在第一位,然后是所有以banana 开头的序列,依此类推..)

【讨论】:

  • 这个答案几乎按预期工作。使用sorted() 获得的排序不完全是问题中的排序,但它足够接近。谢谢马克!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2015-12-28
  • 2018-05-15
  • 2013-03-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多