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

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

普遍认为,n个不同符号的列表有n! 排列。 但是,当符号不明确时,在math和其他地方最常见的惯例似乎是只计算不同的排列。 因此,列表[1, 1, 2] 1,1,2 [1, 1, 2]的排列通常被认为是

[1, 1, 2], [1, 2, 1], [2, 1, 1] 。 事实上,下面的C ++代码正好打印出这三个:

int a[] = {1, 1, 2}; do { cout<

另一方面,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文档中这样说:

元素根据他们的位置被视为唯一的,而不是他们的价值。

我的问题:为什么这个devise决定了?

看来按照惯例,会给出更有用的结果(实际上它通常正是我想要的),还是有一些我缺less的Python行为的应用程序?

[或者是一些执行问题? 在next_permutation的algorithm – 例如在这里(由我)在这里解释StackOverflow ,并在这里显示为O(1)摊销 – 看起来是有效的,并且可以在Python中实现,但Python做的事情更有效,因为它不保证字典顺序基于价值? 如果是的话,效率提高是否值得呢?]

我不能代表itertools.permutations (Raymond Hettinger)的devise师,但在我看来,有一些赞成devise的观点:

首先,如果你使用next_permutation风格的方法,那么你只能传入支持线性sorting的对象。 而itertools.permutations提供了任何types的对象的排列。 想象一下,这将是多么令人讨厌:

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

其次,通过不testing对象上的相等性, itertools.permutations避免了在通常情况下不需要调用__eq__方法的代价。

基本上, itertools.permutations可靠而廉价地解决了常见的情况。 当然有一个论点需要提出, itertools应该提供一个避免重复排列的函数,但是除了itertools.permutations之外,这个函数应该不是itertools.permutations而是它。 为什么不写这样的function并提交补丁?

我接受Gareth Rees的答案作为最吸引人的解释(Python库devise者的答案不足),即Python的itertools.permutations没有比较元素的值。 想一想,这就是问题所在,但是我现在看到它是如何被看作是一个优势,取决于通常使用itertools.permutations 。

为了完整起见,我比较了三种产生所有不同排列的方法。 方法1是非常低效的记忆方式和时间方式,但要求最less的新代码,就是包装Python的itertools.permutations ,就像zeekay的答案一样。 方法2是C ++的next_permutation一个基于生成器的版本,来自这个博客文章 。 方法3是我写的更接近于C ++的next_permutationalgorithm ; 它就地修改了这个列表(我没有把它做得太笼统)。

def next_permutationS(l): n = len(l) #Step 1: Find tail last = n-1 #tail is from `last` to end while last>0: if l[last-1] < l[last]: break last -= 1 #Step 2: Increase the number just before tail if last>0: small = l[last-1] big = n-1 while l[big] <= small: big -= 1 l[last-1], l[big] = l[big], small #Step 3: Reverse tail i = last j = n-1 while i < j: l[i], l[j] = l[j], l[i] i += 1 j -= 1 return last>0

这里有一些结果。 我现在对Python的内置函数更加尊重:当元素全部(或者几乎全部)不同时,它比其他方法快三到四倍。 当然,当有很多重复的元素时,使用它是一个可怕的想法。

Some results ("us" means microseconds): l m_itertoolsp m_nextperm_b m_nextperm_s [1, 1, 2] 5.98 us 12.3 us 7.54 us [1, 2, 3, 4, 5, 6] 0.63 ms 2.69 ms 1.77 ms [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 6.93 s 13.68 s 8.75 s [1, 2, 3, 4, 6, 6, 6] 3.12 ms 3.34 ms 2.19 ms [1, 2, 2, 2, 2, 3, 3, 3, 3, 3] 2400 ms 5.87 ms 3.63 ms [1, 1, 1, 1, 1, 1, 1, 1, 1, 2] 2320000 us 89.9 us 51.5 us [1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4, 4] 429000 ms 361 ms 228 ms

代码在这里,如果有人想探索。

通过包装itertools.permutations来获得您喜欢的行为是相当容易的,这可能会影响决策。 如文档中所述, itertools被devise为构build您自己的迭代器的构build块/工具的集合。

def unique(iterable): seen = set() for x in iterable: if x in seen: continue seen.add(x) yield x for a in unique(permutations([1, 1, 2])): print a (1, 1, 2) (1, 2, 1) (2, 1, 1)

但是,正如评论中指出的那样,这可能不是你想要的效率:

>>> %timeit iterate(permutations([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2])) 1 loops, best of 3: 4.27 s per loop >>> %timeit iterate(unique(permutations([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2]))) 1 loops, best of 3: 13.2 s per loop

也许如果有足够的兴趣, itertools.permutations的新function或可选参数可以被添加到itertools ,以更有效地产生排列而不重复。

我也觉得itertools没有更直观的独特排列概念的function。 生成重复排列只是为了select其中的唯一对于任何严重的应用程序来说都是不可能的。

我写了自己的迭代生成器函数,其行为与itertools.permutations类似,但不返回重复。 只考虑原始列表的排列,可以使用标准的itertools库创build子列表。

def unique_permutations(t): lt = list(t) lnt = len(lt) if lnt == 1: yield lt st = set(t) for d in st: lt.remove(d) for perm in unique_permutations(lt): yield [d]+perm lt.append(d)

也许我错了,但似乎这样做的理由是: “元素根据他们的位置被视为唯一的,而不是他们的价值。 所以如果input元素是唯一的,那么在每个排列中都不会有重复的值。 你已经指定了(1,1,2),从你的angular度来看1在0索引和1在1索引是一样的 – 但是这并不是如此,因为排列python实现使用索引而不是值。

所以如果我们看一下默认的python permutations实现,我们会看到它使用索引:

def permutations(iterable, r=None): pool = tuple(iterable) n = len(pool) r = n if r is None else r for indices in product(range(n), repeat=r): if len(set(indices)) == r: yield tuple(pool[i] for i in indices)

例如,如果将input更改为[1,2,3],则将得到正确的排列([(1,2,3),(1,3,2),(2,1,3),(2,3 ,1),(3,1,2),(3,2,1)]),因为这些值是唯一的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/305975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

. NET5一出,. NET岗面试普遍喊难,真相是…

.NET高级开发/架构师笔试题TOP101、如何设计一个高并发系统&#xff1f;2、如何实现一个.Net5 IOC框架&#xff1f;3、100W并发4G数据&#xff0c;10W并发400G数据&#xff0c;如何设计Redis存储方式&#xff1f;4、如何实现负载均衡Hash一致性算法&#xff1f;5、DotNetty能够…

计算机所有数据的表示方式都是用,计算机数据表示

1、进制1.1 进制的由来进制&#xff1a;是一种进位的方式。x进制&#xff0c;表示逢x进1。计算机的电子原件的状态&#xff1a;开&#xff0c;关。那么&#xff0c;我们表达数据的时候&#xff0c;也是按照开&#xff0c;关的状态来表示的。如果我们表达数据仅仅使用这两种昨天…

数据库年月日时分秒_数据库基本使用系列(二)

书接上回&#xff0c;上回说到数据库的发展历史&#xff0c;存储引擎以及在库层面的一些操作&#xff0c;这次来讲一下数据库中的一些基本的一些数据格式以及对表的一些操作。数据类型数据库提供的数据类型&#xff0c;包括整数类型、浮点数类型、定点数类型、位类型、日期和时…

C# 9 新特性 —— 增强的模式匹配

C# 9 新特性 —— 增强的模式匹配IntroC# 9 中进一步增强了模式匹配的用法&#xff0c;使得模式匹配更为强大&#xff0c;我们一起来了解一下吧SampleC# 9 中增强了模式匹配的用法&#xff0c;增加了 and/or/not 操作符&#xff0c;而且可以直接判断属性&#xff0c;来看一下下…

arma3自定义服务器,Arma3 生存服架设教程,武装突袭3游戏服务器架设

Arma3 生存服架设教程&#xff0c;武装突袭3游戏服务器架设此教程仅适用于Windows系统&#xff0c;独立服务器或者家用电脑都可以用本教程简单搭设Exile Mod。开服其实很简单, 只要你有足够的耐心&#xff01;1.首先 在你的服务器上打开steam下载ArmA 3 Server (SteamCMD 则使用…

netcore读取json文件_【NET Core】.NET Core中读取json配置文件

在.NET Framework框架下应用配置内容一般都是写在Web.config或者App.config文件中&#xff0c;读取这两个配置文件只需要引用System.Configuration程序集&#xff0c;分别用System.Configuration.ConfigurationManager.AppSettings["SystemName"];//读取appSettings配…

前端数据层落地实践

源宝导读&#xff1a;天际移动平台经过重构改版&#xff0c;近期正式发布了1.0版本&#xff0c;我们在低代码开发方面做了进一步增强。本文主要围绕前端Model、前端业务逻辑(领域模型)、数据层与视图层解耦(包装器模式)3个方面&#xff0c;给大家分享一下统一数据层方案的设计思…

计算机内存条只认了一个,怎么解决Win10插入2个4G内存条却只显示4G?

为了提高 Win10系统 的运行速度&#xff0c;有用户在自己的电脑中&#xff0c;插入了2根4G内存&#xff0c;可是发现电脑只能显示4G而不是8G&#xff0c;奇怪的是使用卤蛋师却可以检测到8G内存&#xff0c;这是怎么回事呢&#xff1f;我们该如何解决呢&#xff1f;下面&#xf…

scanf 返回值_scanf函数

一、函数scanf()是C语言中的一个输入函数。与printf函数一样&#xff0c;都被声明在头文件stdio.h里&#xff0c;因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数&#xff0c;即按用户指定的格式从键盘上把数据输入到指定的变量之中。函数的原型为&…

【Git】Git-常用命令备忘录(三)

git作为一个vcs&#xff08;version control system&#xff09;&#xff0c;是越用越香&#xff0c;那么还有哪些比较香的地方呢&#xff01;&#xff1f;1.远程仓库中拉取指定分支一定遇到这种情况&#xff0c;github看到一个心仪的开源仓库&#xff0c;但是分支太多&#xf…

jenkins换服务器找不到包,服务器重启后Jenkins项目部分丢失问题解决方法

UVALive 4670 Dominating Patterns --AC自动机第一题题意:多个模板串,一个文本串,求出那些模板串在文本串中出现次数最多. 解法:AC自动机入门模板题. 代码: #include #include phpMyAdmin - 错误 您应升级到 MySQL 5&period;5&period;0 或更高版本&comma;解决办法。…

mysql表类型_MySQL表类型的选择

P131)创建表时的默认引擎是InnoDB&#xff0c;如果要修改默认的存储引擎&#xff0c;可以在参数文件中设置default-table-type。查看当前的默认存储引擎&#xff0c;可以使用一下命令&#xff1a;创建新表的时候可以通过增加ENGINE关键字设置新建表的存储引擎。也可以通过ALTER…

计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案

【技术实现步骤摘要】一种敏感数据自适应的脱敏方法、系统本专利技术涉及计算机技术与信息安全领域&#xff0c;并且更具体地&#xff0c;涉及一种敏感数据自适应的脱敏方法、系统。技术介绍随着数据时代的到来&#xff0c;数据中蕴藏的巨大价值得以挖掘&#xff0c;同时也带来…

ASP.NET Core Controller与IOC的羁绊

前言看到标题可能大家会有所疑问Controller和IOC能有啥羁绊&#xff0c;但是我还是拒绝当一个标题党的。相信有很大一部分人已经知道了这么一个结论&#xff0c;默认情况下ASP.NET Core的Controller并不会托管到IOC容器中&#xff0c;注意关键字我说的是"默认"&#…

win10 mysql my.cnf_MySQL配置文件无法修改的解决方法(Win10)

帮别人解决的问题&#xff0c;记录一下。问题描述MySQL的版本是5.7&#xff0c;操作系统是window10。MySQL安装在 C:\Program Files 下。最近需要在MySQL安装目录下的 my-default.ini 配置文件里面加上一个新的配置项&#xff1a;max_allowed_packet100M编辑文件后保存&#xf…

服务器机房 维护,服务器机房建设与管理维护.pdf

服务器服务器机房机房建设与管理维护建设与管理维护服务器服务器机房机房建设与管理维护建设与管理维护电子科技大学信息中心目录服务器机房的设计和建设服务器机房的设计和建设服务器机房的运行维护和管理服务器机房的设计与建设一、机房对信息化的发展的重要性二、计算机…

引入Jaeger——扩展

Jaeger是收集全链路跟踪的信息&#xff0c;在Jaeger收集的信息中&#xff0c;有请求的url信息&#xff0c;有每个请求的时间间隔&#xff0c;借助这些信息可以进行报警&#xff0c;比如一次较长的请求&#xff0c;或者是某些请求的次数和先后等。不管报警的业务规则是什么&…

mysql 操作类 C .net_.NET MYSQL数据库操作基类( C#源码)

使用MySql.Data.dll&#xff0c;它.Net访问MySQL数据库的一个驱动  下载DbHelperMySql.CSusing System;using System.Collections;using System.Collections.Specialized;using System.Data;using System.Data.SqlClient;using System.Configuration;using MySql.Data.Types;…

判断 服务器架构性能 数据,服务器架构之性能扩展-第五章(6)

Mysql>create table t2 like t1;//复制表结构Mysql>insert into t2 select * from t1; //复制数据内容索引是一种快速查询的有效方法&#xff0c;可以通过alter增加索引或create语句创建。mysql>alter table t1 add ind_id (id);mysql>alter table t1 add unique/p…

微服务畅想录

关于微服务的文章&#xff0c;网络上很多&#xff0c;也比较专业。下面&#xff0c;我尝试着用简单的话写点自己对微服务的理解&#xff0c;非常接地气&#xff0c;但只是一家之言&#xff0c;大家还是带着辩证的眼光来读。1、微服务的本质是什么&#xff1f;微服务的本质是&am…