既然Python 3.7使得保留顺序的dicts 正式成为语言规范的一部分而不是实现细节,那么我一直在努力探讨如何最好地使用这个属性.今天,我发现我需要一个订单保留集,并认为字典可以做到这一点.
假设我们有一个hashable元素列表.我们需要一个唯一条目列表,我们希望根据首次出现保留这些条目的顺序.一个简单的字典构造函数应该做的伎俩:
ls = "Beautiful is better than ugly. Explicit..."
uniques = list({s:0 for s in ls})
>>> ['B', 'e', 'a', 'u', 't', 'i', 'f', 'l', ' ', 's', 'b', 'r', 'h', 'n', 'g', 'y', '.', 'E', 'x', 'p', 'c']
Run Code Online (Sandbox Code Playgroud)
这将通过首次出现保留排序并消除所有重复.
我想知道社区对这个用例以及一般的订单保留功能的看法.
通过Python的Zen阅读,我很矛盾.该方法很简单,但依赖于隐式排序.
请让我知道你在想什么.谢谢.
__init__为了清晰和组织原因,我试图总是在里面声明类属性.最近,我了解到严格遵循这种做法还有额外的非美学好处,这要归功于为Python 3.3添加了PEP 412.具体来说,如果在中定义了所有属性__init__,则对象可以通过共享其键和散列来减少空间.
我的问题是,当在被调用的函数中声明属性时,对象密钥共享是否会发生__init__?
这是一个例子:
class Dog:
def __init__(self):
self.height = 5
self.weight = 25
class Cat:
def __init__(self):
self.set_shape()
def set_shape(self):
self.height = 2
self.weight = 10
Run Code Online (Sandbox Code Playgroud)
在这种情况下,所有实例都Dog将共享密钥height和weight.实例Cat也分享密钥height和weight(彼此之间,Dog当然不是s).
顺便说一句,你会如何测试?
请注意,Brandon Rhodes在他的词典甚至Mightier谈话中说这是关于密钥共享的:
如果添加的单个键不在原型键集中,则会松开密钥共享