人们普遍认为,n 个列表distinct符号有 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 文档 http://docs.python.org/release/2.6.6/library/itertools.html?highlight=itertools#itertools.permutations这么说:
元素根据其位置而不是其值被视为唯一。
我的问题:为什么做出这个设计决定?
似乎遵循通常的约定会给出更有用的结果(实际上这通常正是我想要的)......或者是否有我缺少的Python行为的一些应用?
[或者是一些实施问题?算法如下next_permutation
——例如 StackOverflow 上的解释在这里(由我) https://stackoverflow.com/questions/352203/generating-permutations-lazily/353248#353248 and 此处显示为 O(1) 摊销 https://stackoverflow.com/questions/4973077/the-amortized-complexity-of-stdnext-permutation— 在 Python 中似乎高效且可实现,但 Python 是否在做更高效的事情,因为它不保证基于值的字典顺序?如果是这样,效率的提高是否值得?]