【发布时间】:2011-09-25 22:33:21
【问题描述】:
普遍认为n个不同符号的列表有n!排列。然而,当符号不明确时,数学和其他领域中最常见的约定似乎是只计算不同的排列。因此列表[1, 1, 2] 的排列通常被认为是[1, 1, 2], [1, 2, 1], [2, 1, 1]。事实上,下面的 C++ 代码正好打印出这三个:
int a[] = {1, 1, 2};
do {
cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<endl;
} while(next_permutation(a,a+3));
另一方面,Python 的 itertools.permutations 似乎打印了其他内容:
import itertools
for a in itertools.permutations([1, 1, 2]):
print a
打印出来
(1, 1, 2)
(1, 2, 1)
(1, 1, 2)
(1, 2, 1)
(2, 1, 1)
(2, 1, 1)
正如用户Artsiom Rudzenka 在回答中指出的那样,Python documentation 是这么说的:
元素根据它们的位置而不是它们的值被视为唯一的。
我的问题:为什么做出这个设计决定?
似乎遵循通常的约定会产生更有用的结果(实际上它通常正是我想要的)......或者是否有一些我缺少的 Python 行为应用程序?
[或者是一些实现问题? next_permutation 中的算法——例如 StackOverflow here (by me) 和 shown here to be O(1) amortised 中解释的算法——在 Python 中似乎是高效且可实现的,但 Python 是否做得更高效,因为它不能保证基于值的字典顺序?如果是这样,那么提高效率是否值得?]
【问题讨论】:
-
根据documentation Python 确实保证字典顺序。
-
上面的输出示例似乎没有排序(1,2,1 在 1,1,2 之前)。也许是因为元素不是唯一的?
-
@Macke:是的,这就是我的意思——字典顺序是基于位置,而不是价值。如果您将两个 1 视为“1”和“1+”,第二个更大,那么 (1,2,1+) 在 (1+,1,2) 之前就可以了。但是,当然,1 是 1。:-) 另外,如果您要求它提供 [3,2,1] 的排列(例如),那么结果实际上将按字典顺序倒序排列。如果你要求 [2, 1,3],它们都不会出现。关键是 Python 不看值,只看位置。
-
我也想知道。特别是因为“元素根据其位置而不是其价值被视为唯一”似乎是多余的 - 一次只有一个元素可以占据特定位置,所以基本上他们说“我们假设所有元素都是不同的”或“我们不'不检查解决方案的唯一性"。
标签: python algorithm language-design permutation