普遍认为具有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文档中有所说明:
元素是基于它们的位置而非值来视为唯一的。
我的问题是:为什么要做出这个设计决定?
按照通常的惯例似乎会产生更有用的结果(实际上这通常正是我想要的)... 或者我是否忽略了Python行为的某些应用?
[还是说这是某种实现上的问题?像next_permutation
算法——例如在StackOverflow中由我解释并且被证明是O(1)平摊复杂度的 —— 在Python中似乎很高效且易于实现,但是Python是否做出了更加高效的方法,因为它不保证基于值的字典序?如果是这样,那增加的效率是否值得考虑?]