计算包含某些项目的列表集的总唯一排列的算法

Posted

技术标签:

【中文标题】计算包含某些项目的列表集的总唯一排列的算法【英文标题】:Algorithm to calculate total unique permutations of set of lists that contain some items 【发布时间】:2014-08-03 13:34:14 【问题描述】:

考虑这样的配置文件:

A = <some value> 
B = <some value>
C = <some value>

其中每个选项 A/B/C 可以占用属于列表 L 的任何值 X。此列表 L 的大小是固定的并且事先已知。请注意,配置文件中可以有任意数量的条目 - 即可以有 D、E、F .. 等等 ..

因此,作为一个例子,

A = <any value from list 1,2,3,4>
B = <any value from list 5, 10, 15> 
C = <any value from list 10,20,30,40,50>

生成可能的配置文件的每个排列的算法是什么(不重复)?

这意味着创建所有可能的配置文件,例如 -

A=1
B=5
C=10

A=1
B=5
C=20

A=1
B=5
C=30

.
.
.

And so on

我知道这可能不完全符合“编程问题”的要求,而是“算法问题”,但我已经看到来自Project Euler 的问题,并且在这里被问到(并且得到了很好的赞赏)。如果这离题或其他什么,我仍然道歉。

【问题讨论】:

这不是一个排列,而是一个产品。 itertools.product(A,B,C) 会产生你想要的。 @mata 其中 A,B,C 是可能值的列表? 【参考方案1】:

这应该可行。您应该阅读标准库 itertools 模块:https://docs.python.org/2/library/itertools.html#itertools.product

import itertools

l1 = [1,2,3,4]
l2 = [5,10,15]
l3 = [10, 20, 30, 40, 50]

for a, b, c in itertools.product(l1, l2, l3):
    print a,b,c

因为itertools.product的方法签名是:(*iterables[,repeat])

您只需执行以下操作即可轻松处理可变数量的列表:

lists = get_my_lists() # whatever
itertools.product(*lists) 

【讨论】:

这是一个库而不是算法。 算法是“计算product”。 Python 恰好附带了这个algorithm 的高性能标准实现。 @MikeSteder 是否可以将包含单个列表本身的列表的列表传递给该产品功能? @Wildling - 当然,只需使用参数 unpaking:L = [l1, l2, ...] 然后itertools.product(*L)【参考方案2】:

或手动:

[(x,y,z) for x in l1 for y in l2 for z in l3] ...

【讨论】:

以上是关于计算包含某些项目的列表集的总唯一排列的算法的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种算法可以生成多重集的所有唯一循环排列?

如何在插入包含对象集的对象列表期间忽略唯一违规

计算大型数据集的python树高度

快速的独特组合(来自有重复的列表),无需查找

使用下拉列表的 Javascript 计算

SQL-查找仅包含某些项目的订单