我喜欢Python的原因之一是元组,列表,集和字典提供的表达能力/减少的编程工作量。一旦你理解了列表理解和一些使用IN和FOR的基本模式,生活就会变得更好! Python摇滚。
然而,我确实想知道为什么这些结构会被视为不同,以及随着时间的推移这会如何变化(变得陌生)。回到Python 2.x,我本可以提出一个论点,他们都只是基本集合类型的变体,并且有些令人恼火的是,一些非奇特的用例要求你将字典转换为列表并再次返回。 (字典不仅仅是具有特定唯一性约束的元组列表吗?列表不是仅具有不同类型的唯一性约束的集合吗?)。
现在在3.x世界中,它变得更加复杂。现在有名为元组 - 开始感觉更像是一个特例字典。现在有订单的词典 - 开始感觉更像是一个列表。我刚看到有序套装的配方。我可以想象这种情况......以及独特的清单等等。
Python的禅宗说“应该有一个 - 最好只有一个 - 明显的方式”。在我看来,这种专门的集合类型的大量与这个Python规则相冲突。
核心Pythonistas的想法是什么?
答案 0 :(得分:14)
答案 1 :(得分:14)
这些数据类型都有不同的用途,在理想的世界中,您可以更多地统一它们。但是,在现实世界中,我们需要具有基本集合的高效实现,例如,排序会增加运行时惩罚。
命名元组主要用于使stat()等接口更有用,在处理SQL行集时也可以很好。
您正在寻找的大型统一实际上是以不同的访问协议(getitem,getattr,iter,...)的形式,这些类型混合并匹配用于其预期目的。
答案 2 :(得分:2)
首先,在Python 2中引入了有序字典和命名元组,但这不是重点。
我不会指出你的文件,因为如果你真的感兴趣,你会读它们。
集合类型之间的第一个区别是可变性。 tuple
和frozenset
是不可变类型。这意味着它们可以比list
或set
更高效。
如果您想要随机或按顺序访问某些内容,但最终会更改,则需要list
。如果你想要的东西也可以在开头改变,你需要一个deque
。
你根本不能吃蛋糕并且吃掉它 - 你添加的每个功能都会让你失去一些速度。
dict
和set
与lists
和元组`有根本的不同。它们存储密钥的哈希值,允许您快速查看项目是否在其中,但需要密钥可以清除。您没有使用链接列表或数组获得相同的成员资格测试速度。
当你到达OrderedDict
和NamedTuple
时,你谈论的是用Python实现的内置类型的子类,而不是C语言。它们用于特殊情况,就像 any您必须导入的标准库中的其他代码。它们不会使命名空间变得混乱,但是当你需要它们时很好。
有一天,你会编码,你会说,“伙计,现在我知道完全他们的意思是'应该有一个 - 最好只有一个 - - 显而易见的方法',set
只是只是我需要的东西,我很高兴它是Python语言的一部分!如果我必须使用列表,它将永远。“那时你会明白为什么存在这些不同的类型。
答案 3 :(得分:1)
字典按键索引(事实上,它是一个哈希映射);一个通用的元组列表将不会。您可能会认为两者都应该作为关系实现,并且能够随意添加索引,但实际上,为常见用例提供优化类型更方便,更有效。
新的专业馆藏得到了补充,因为它们很常见,很多人最终会使用更基本的数据类型来实现它们,然后你就会遇到轮子改造的常见问题(浪费精力,缺乏互操作性...... )。如果Python只提供了一个完全通用的构造,那么我们会让很多人问“如何使用关系实现集合”等等。
(顺便说一句,我在数学或数据库意义上使用关系)
答案 4 :(得分:1)
所有这些专门的集合类型都提供了list,tuple,dict和set的“标准”数据类型无法充分或有效提供的特定功能。
例如,有时您需要一组唯一的项目,并且还需要保留遇到它们的顺序。您可以使用集合来跟踪成员资格和列表以跟踪顺序,但是您的解决方案可能比专门为此目的而设计的专用数据结构(例如有序集)更慢且更需要内存。
这些额外的数据类型,您可以看作基本数据类型的组合或变体,实际上填补了基本数据类型留下的功能空白。从实际角度来看,如果Python的核心或标准库没有提供这些数据类型,那么任何需要它们的人都会发明自己的低效版本。它们的使用频率低于基本类型,但通常足以使其提供标准实现。
答案 5 :(得分:0)
我最喜欢Python的一个方面就是敏捷性。许多功能性,有效和可用的集合类型都给了我。
还有一种方法可以做到这一点 - 每种类型都有自己的工作。
答案 6 :(得分:0)
数据结构的世界(语言不可知)通常可以归结为一些小的基本结构 - 列表,树,哈希表和图形等,以及它们的变体和组合。每个在使用和实施方面都有自己的特定目的。
我不认为您可以执行诸如将字典缩减为具有特定唯一性约束的元组列表而不实际指定字典的操作。字典具有特定目的 - 键/值查找 - 并且数据结构的实现通常是针对这些需求而定制的。集合在很多方面都像字典,但集合上的某些操作对字典(并集,析取等)没有意义。
我不认为这违反了“禅宗禅”的做法。虽然您可以使用排序字典来执行字典所执行的操作而不使用已排序的部分,但您更多地违反了Occam的剃刀并且可能会导致性能下降。我认为这不同于能够在语法上以不同的方式做一些Perl。
答案 7 :(得分:0)
Python的禅宗说“应该有一个 - 最好只有一个 - 明显的方式”。在我看来,这种专门的集合类型的大量与这个Python规则相冲突。
不是远程的。这里有几件不同的事情要做。我们为工作选择合适的工具。所有这些容器都是基于数十年来久经考验的,经过测试的真实CS概念。
字典与元组不同:它们针对键值查找进行了优化。元组也是不可变的,它将它与列表区分开来(你可以认为它类似于frozenlist
)。如果您发现自己将字典转换为列表并返回,那么您几乎肯定会做错事;一个例子会有所帮助。
为方便起见,存在命名元组,实际上是用于替换简单类而不是字典。有序词典只是为了记住事物被添加到字典中的顺序。并且3.x中都没有新内容(尽管可能有更好的语言支持;我没看过)。