小编Nat*_*aul的帖子

使用有序字典作为有序集

既然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)

这将通过首次出现保留排序并消除所有重复.

我想知道社区对这个用例以及一般的订单保留功能的看法.

  • 有没有理由不使用这种方法?
  • 有没有更好的方法来解决这个问题?
  • 这种方法是Pythonic吗?

通过Python的Zen阅读,我很矛盾.该方法很简单,但依赖于隐式排序.

请让我知道你在想什么.谢谢.

python python-3.x dictionary-comprehension python-3.7

8
推荐指数
2
解决办法
1770
查看次数

声明从__init__调用的函数中的变量是否仍然使用密钥共享字典?

__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将共享密钥heightweight.实例Cat也分享密钥heightweight(彼此之间,Dog当然不是s).

顺便说一句,你会如何测试?

请注意,Brandon Rhodes在他的词典甚至Mightier谈话中说这是关于密钥共享的:

如果添加的单个键不在原型键集中,则会松开密钥共享

python dictionary python-3.x python-internals

7
推荐指数
2
解决办法
194
查看次数