Chr*_*son 23 python collections language-design zen-of-python
我喜欢Python的原因之一是由元组,列表,集合和字典提供的表达能力/减少编程工作.一旦你理解了列表理解和一些使用IN和FOR的基本模式,生活就会变得更好!Python摇滚.
但是我确实想知道为什么这些结构会被视为不同,以及随着时间的推移它会如何变化(变得陌生).回到Python 2.x,我本可以提出一个论点,它们只是基本集合类型的变体,并且有些令人恼火的是,一些非常外用例需要您将字典转换为列表并再次返回.(字典不仅仅是具有特定唯一性约束的元组列表吗?列表不是仅具有不同类型的唯一性约束的集合吗?).
现在在3.x世界中,它变得更加复杂.现在有名为元组 - 开始感觉更像是一个特例字典.现在有订单的词典 - 开始感觉更像是一个列表.我刚看到有序套装的配方.我可以想象一下这个......还有什么独特的清单等等.
Python的禅宗说"应该有一个 - 最好只有一个 - 明显的方式".在我看来,这种专门的集合类型的大量与这个Python规则相冲突.
硬核Pythonistas的想法是什么?
pyr*_*ope 15
这些数据类型都有不同的用途,在理想的世界中,您可以更多地统一它们.但是,在现实世界中,我们需要有效地实现基本集合,例如,排序会增加运行时惩罚.
命名元组主要用于使stat()等接口更有用,并且在处理SQL行集时也可以很好用.
你正在寻找的大统一实际上是以不同的访问协议(getitem,getattr,iter,...)的形式,这些类型混合和匹配用于它们的预期目的.
mac*_*ing 14
你在所有这些数据结构中看到一些相似之处是正确的.请记住,python使用duck-typing(如果它看起来像鸭子和呱呱叫鸭子那么它就是鸭子).如果您可以在相同的情况下使用两个对象,那么对于您当前的意图和目的,它们可能也是相同的数据类型.但是你总是要记住,如果你试图在其他情况下使用它们,它们可能不再以相同的方式运行.
考虑到这一点,我们应该看看你提到的四种数据类型的实际不同和相同之处,以便大致了解它们可以互换的情况.
您可以更改词典,列表和集.如果不制作副本,则无法"更改"元组.
易变的:dict,list,set
一成不变的: tuple
Python string也是一种不可变类型.为什么我们想要一些不可变对象?我会从这个答案中解释一下:
不可变对象可以进行很多优化
在Python中,只有不可变的是可散列的(并且只有可散列的对象可以是集合的成员,或者是字典中的键).
比较这个属性,列表和元组看起来像"最接近"的两种数据类型.在高级别,元组是列表的不可变"冻结帧"版本.这使得列表对于随时间变化的数据集很有用(因为您不必复制列表来修改它),但是元组对于字典键(必须是不可变类型)这样的东西很有用.
字典就像一个集合,没有固有的概念顺序.这与有订单的列表和元组形成对比.dict或set中的项目的顺序是从程序员中抽象出来的,这意味着如果元素A在for k in mydata循环中出现在B之前,那么一旦你开始,你就不应该(并且通常不能)依赖A之前的A做出改变mydata.
保序:list,tuple
非保序:dict,set
从技术上讲,如果你mydata连续迭代两次它将是相同的顺序,但这是python机制的一个方便的特性,而不是set 抽象数据类型的一部分(数据类型的数学定义) .列表和元组确实保证了顺序,特别是不可变的元组.
每个"元素"一"项目": ,,setlisttuple
每个"元素"有两个"项目": dict
我想在这里你可以看到一个命名元组,它具有每个元素的名称和值,作为字典的不可变模拟.但这是一个微妙的比较 - 请记住,如果您尝试在命名元组上使用仅字典方法,则鸭子类型将导致问题,反之亦然.
字典不仅仅是具有特定唯一性约束的元组列表吗?
不,有几个不同之处.字典没有固有的顺序,这与列表不同.
此外,字典具有每个"元素"的键和值.另一方面,元组可以具有任意数量的元素,但每个元素仅具有值.
由于字典的机制,键的作用就像一个集合,如果你有密钥,你可以在恒定的时间内查找值.在元组列表(这里是对)中,您需要遍历列表直到找到密钥,这意味着搜索将与列表中的元素数量成线性关系.
但最重要的是,字典项可以更改,而元组则不能.
列表不是仅具有不同类型的唯一性约束的集合吗?
我再次强调,集合没有固有的顺序,而列表则没有.这使列表更有用于表示堆栈和队列之类的内容,您希望能够记住附加项目的顺序.套装没有这样的保证.然而,它们确实提供了能够在恒定时间内进行成员资格查找的优势,而再次列表需要线性时间.
现在有名为元组 - 开始感觉更像是一个特例字典.现在有订单的词典 - 开始感觉更像是一个列表.我刚看到有序套装的配方.我可以想象一下这个......还有什么独特的清单等等.
在某种程度上,我同意你的意见.但是,数据结构库可用于支持已经完善的数据结构的常见用例.这使程序员不必浪费时间尝试为标准结构提供自定义扩展.只要它不会失控,我们仍然可以看到每个解决方案中的独特用途,最好在货架上安装一个轮子,这样我们就不需要重新发明它.
一个很好的例子是Counter()类.这个专业词典对我来说比我可以使用的次数多了很多次(badoom-tshhhhh!),它为我节省了编写自定义解决方案的工作量.我宁愿有一个解决方案,社区正在帮助我开发和保持适当的python最佳实践,而不是在我的自定义数据结构文件夹中的东西,并且每年只使用一次或两次.