2024-03-29 07:50:16 发布
网友
Python有一个ordered dictionary。订一套怎么样?
字典的键是唯一的。因此,如果忽略有序字典中的值(例如,通过给它们赋值None),那么本质上就是一个有序集。
None
As of Python 3.1有^{}。下面是OrderedSet的示例实现。(注意,只需要定义或重写很少的方法:collections.OrderedDict和^{}来完成繁重的工作。)
collections.OrderedDict
import collections class OrderedSet(collections.OrderedDict, collections.MutableSet): def update(self, *args, **kwargs): if kwargs: raise TypeError("update() takes no keyword arguments") for s in args: for e in s: self.add(e) def add(self, elem): self[elem] = None def discard(self, elem): self.pop(elem, None) def __le__(self, other): return all(e in other for e in self) def __lt__(self, other): return self <= other and self != other def __ge__(self, other): return all(e in self for e in other) def __gt__(self, other): return self >= other and self != other def __repr__(self): return 'OrderedSet([%s])' % (', '.join(map(repr, self.keys()))) def __str__(self): return '{%s}' % (', '.join(map(repr, self.keys()))) difference = property(lambda self: self.__sub__) difference_update = property(lambda self: self.__isub__) intersection = property(lambda self: self.__and__) intersection_update = property(lambda self: self.__iand__) issubset = property(lambda self: self.__le__) issuperset = property(lambda self: self.__ge__) symmetric_difference = property(lambda self: self.__xor__) symmetric_difference_update = property(lambda self: self.__ixor__) union = property(lambda self: self.__or__)
答案是否定的,但是您可以使用Python标准库中的^{}来实现相同的目的,只使用键(值为None)。
更新:从Python 3.7(和cpython3.6)开始,标准的dict是guaranteed to preserve order,比OrderedDict性能更好。(但是,为了向后兼容,特别是可读性,您可能希望继续使用OrderedDict。)
dict
OrderedDict
下面是一个例子,说明如何使用dict作为一个有序集,在保留顺序的同时过滤掉重复项,从而模拟有序集。使用dict类方法fromkeys()创建dict,然后简单地请求keys()返回。
fromkeys()
keys()
>>> keywords = ['foo', 'bar', 'bar', 'foo', 'baz', 'foo'] >>> list(dict.fromkeys(keywords).keys()) ['foo', 'bar', 'baz']
这里有一个ordered set(可能是new link)的配方,它是从Python 2 Documentation中引用的。这在Py2.6或更高版本和3.0或更高版本上运行,无需任何修改。这个接口几乎和一个普通的集合完全一样,只是初始化应该用一个列表来完成。
OrderedSet([1, 2, 3])
这是一个可变集,因此.union的签名与set的签名不匹配,但是由于它包含__or__,可以很容易地添加类似的内容:
.union
__or__
@staticmethod def union(*sets): union = OrderedSet() union.union(*sets) return union def union(self, *sets): for set in sets: self |= set
有序集在功能上是有序字典的特例
字典的键是唯一的。因此,如果忽略有序字典中的值(例如,通过给它们赋值
None
),那么本质上就是一个有序集。As of Python 3.1有^{} 。下面是OrderedSet的示例实现。(注意,只需要定义或重写很少的方法:} 来完成繁重的工作。)
collections.OrderedDict
和^{答案是否定的,但是您可以使用Python标准库中的^{} 来实现相同的目的,只使用键(值为
None
)。更新:从Python 3.7(和cpython3.6)开始,标准的
dict
是guaranteed to preserve order,比OrderedDict
性能更好。(但是,为了向后兼容,特别是可读性,您可能希望继续使用OrderedDict
。)下面是一个例子,说明如何使用
dict
作为一个有序集,在保留顺序的同时过滤掉重复项,从而模拟有序集。使用dict
类方法fromkeys()
创建dict,然后简单地请求keys()
返回。这里有一个ordered set(可能是new link)的配方,它是从Python 2 Documentation中引用的。这在Py2.6或更高版本和3.0或更高版本上运行,无需任何修改。这个接口几乎和一个普通的集合完全一样,只是初始化应该用一个列表来完成。
这是一个可变集,因此
.union
的签名与set的签名不匹配,但是由于它包含__or__
,可以很容易地添加类似的内容:相关问题 更多 >
编程相关推荐