为什么 Python 的 itertools.permutations 包含重复项? (当原始列表有重复时)

2024-02-19

人们普遍认为,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 是否在做更高效的事情,因为它不保证基于值的字典顺序?如果是这样,效率的提高是否值得?]


我不能代表设计师说话itertools.permutations(Raymond Hettinger),但在我看来,有几点支持该设计:

首先,如果您使用next_permutation- 风格的方法,那么您将被限制传递支持线性排序的对象。然而itertools.permutations提供了排列any一种物体。想象一下这将是多么烦人:

>>> list(itertools.permutations([1+2j, 1-2j, 2+j, 2-j]))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: no ordering relation is defined for complex numbers

其次,通过不测试对象的相等性,itertools.permutations避免支付拨打电话的费用__eq__方法在通常情况下没有必要。

基本上,itertools.permutations可靠且廉价地解决常见问题。肯定有一个论据可以提出itertools应该提供一个避免重复排列的函数,但是这样的函数应该是除了itertools.permutations,而不是代替它。为什么不写一个这样的函数并提交补丁呢?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Python 的 itertools.permutations 包含重复项? (当原始列表有重复时) 的相关文章

随机推荐

  • 数据库架构更新

    我正在开发一个使用本地 SQLite 数据库的 AIR 应用程序 并且想知道在分发新版本的应用程序时如何管理数据库架构更新 还考虑跳过某些版本的更新 例如 不是从 1 0 到 1 1 而是从 1 0 到 1 5 您会推荐什么技术 对于 SQ
  • WebClient DownloadFileAsync() 阻塞线程

    我正在尝试使用 WPF 和 MVVM 从我的网络服务器下载一个大文件 500 mb 因此 以下属性都绑定到某种控件 进度条 问题是 即使使用 DownloadFileAsync 应用程序仍然挂起 文件is从我的日志中可以看出 正在下载 当然
  • Apple Watch 的预处理器宏?

    我正在看苹果的Lister 适用于 Apple Watch iOS 和 OS X https developer apple com library prerelease ios samplecode Lister Listings Obj
  • Laravel 5.4:如何获取本周的记录?

    为了获取当天的所有记录 我做了 dt Carbon now dataToday Data whereDay created at dt gt day gt get 为了获取本周的记录 我尝试了以下方法 但没有成功 dataThisWeek
  • Ansible win_package 永远卡住

    我正在使用 win package 模块在 Windows 2016 服务器中安装 Nessus 但每当我执行它时 它就会永远挂起而没有响应 即使等了一个小时 也没有任何回应 我已经将 Nessus 安装程序保存在 Windows 服务器目
  • 创建全景视图android

    我想在 Android 中创建一个视图 屏幕 活动 其中的表格包含十列 由于 10 列不会在屏幕中调整宽度 不会采用可读格式 因此我一次显示 3 列 我想在应用程序中集成一个功能 如果用户在桌子上从右向左滑动 滑动 其他 3 4 列应该可见
  • 如何在网格视图中隐藏空列而不知道哪些列是空的?

    我正在使用一个 gridview 它根据下拉列表中的选择从 SQL 数据库中提取数据 源表有六列用于选择的属性 但根据选择的内容 可能会有一到六列为空 全部为空值 当该列为空时 我希望将其隐藏 以便页面不那么笨重和混乱 在过去的几天里 我一
  • 如何在 Debian Linux 系统上以非 root 身份安装 h5py (+numpy+libhdf5+...)

    我需要在 Debian Linux 系统上安装 h5py Python 模块及其所有缺少的依赖项 这项任务因以下原因而变得复杂 我在这个系统上没有任何超级用户权限 没有 sudo 没有 root 密码等 我使用的其余代码需要 Python
  • 生成 .p12 文件时没有证书与私钥匹配

    我已经成功生成了 p12文件 但我收到一条消息 如下所示 C OpenSSL Win32 bin gt openssl pkcs12 export inkey mykey key in exported pem out myfile p12
  • Xamarin.form 键盘出现时向上移动视图

    我正在尝试构建一个聊天应用程序用户界面 布局的想法非常简单 当输入栏获得焦点时 键盘会显示并 推 聊天栏 因为它是一个网格 ListView 将调整大小以适合屏幕 我更新输入栏的边距以 推 它 NSValue result NSValue
  • Qt Creator 需要设置编译器才能构建。在套件选项中配置编译器

    我已经安装了 Qt Creator5 和最新的二进制文件 但是当我运行任何程序时 它会给我这个错误 1 错误 Qt Creator 需要设置编译器才能构建 在套件选项中配置编译器 我已经在整个互联网上搜索了答案 但它不够充分并且没有帮助 请
  • icp变换矩阵解释

    我正在使用 PCL 从 ICP 获取变换矩阵 getTransformationMatrix 例如 对于没有旋转的平移运动获得的结果是 0 999998 0 000361048 0 00223594 0 00763852 0 0003605
  • 根据 nodemon 中的更改运行脚本

    是否可以使用nodemon在更改时运行脚本 是否可以做这样的事情 nodemon watch src exec yarn run my script 因此 理想情况下 我只想在发生更改时才运行脚本src folder 只需在要执行的脚本周围
  • 抑制 tbl_regression 中的置信区间脚注

    我正在使用 gtsummary 包中的 tbl regression 当从线性回归生成输出表时 有一个1CI 置信区间脚注出现在底行 有没有办法在 tbl regression 中抑制这个脚注 Use modify footnote eve
  • ::first-letter 也设置第一个字符的样式

    我有这样的文字 p first letter color red p Welcome p 但后来我意识到 定型了 我尝试使用 before但这也不起作用 p first letter color red p before content p
  • 如何合并两个 Eloquent 集合?

    我有一个问题表和一个标签表 我想从给定问题的标签中获取所有问题 例如 我可能会将 旅行 火车 和 文化 标签附加到给定的问题上 我希望能够获取这三个标签的所有问题 看起来棘手的是 问题和标签关系是多对多 在 Eloquent 中定义为 be
  • 在 iOS 中检测井号标签 #、提及标签 @,就像在 Twitter 应用程序中一样

    我需要检测 Tags描述中给出UILabel并将文本颜色更改为 UIColor BlueColor 我无法更改其中的特定文本颜色UILabel到蓝色 现在我正在使用这个UILabel在定制中UITableViewCell 有什么办法可以解决
  • 如果 Chrome 和 Safari 都使用 Webkit,我是否还需要在它们中测试渲染?

    尽管 Chrome 和 Safari 浏览器都实现了 Webkit 渲染引擎 但是否有必要在这两种浏览器中测试我的网站的渲染 这是开发商的逃避还是一个合理的假设 我特别询问我的网站页面在两种浏览器中是否呈现相同的效果以及我的 Javascr
  • 线程“main”中的异常 java.lang.NumberFormatException:不是版本:9

    我正在尝试运行一个Spark 专家 Scala https github com opencypher caps examples日食中的项目 当我跑步时scala 类 https github com opencypher caps ex
  • 为什么 Python 的 itertools.permutations 包含重复项? (当原始列表有重复时)

    人们普遍认为 n 个列表distinct符号有 n 排列 然而 当符号不明确时 数学和其他领域最常见的约定似乎是仅计算不同的排列 因此列表的排列 1 1 2 通常被认为是 1 1 2 1 2 1 2 1 1 事实上 以下 C 代码准确地打印