Python中集合结果的打印顺序是什么?

7

我在命令提示符中执行以下操作:

>>> a=set()
>>> for i in range(0,8):
...     a.add((i,j))
... 

当我打印它时,得到的答案是这样的:

>>> a
set([(2, 7), (4, 7), (6, 7), (5, 7), (7, 7), (0, 7), (1, 7), (3, 7)])

我知道它是按照存储的方式打印结果。但是有没有办法让它有序呢?比如说这样:
(0,7), (1,7), (2,7), (3,7), ...
2个回答

11

你说得对,集合并不会以排序的方式存储其元素。如果你想要按照排序顺序获取集合中的元素列表,你可以使用内置函数sorted

>>> a
set([(2, 7), (4, 7), (6, 7), (5, 7), (7, 7), (0, 7), (1, 7), (3, 7)])
>>> sorted(a)
[(0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7)]

2
如果您不需要集合的特性,可以使用列表代替集合。
如果您真的需要一个有序的集合,在Python 2.7中,您可以使用collections.OrderedDict.viewkeys()方法可用于获取类似于集合的代理,而在字典上循环将按顺序获取键。
或者,您可以使用collections.MutableSetcollections.OrderedDict(如果您使用的是Python 2.6,则可以使用另一种OrderedDict实现)来实现自己的OrderedSet
class OrderedSet(collections.MutableSet):
    def __init__(self, iterable=[]):
        self._data = collections.OrderedDict((x, None) for x in iterable)

    def __contains__(self, x):
        return x in self._data

    def __iter__(self):
        return iter(self._data)

    def __len__(self):
        return len(self._data)

    def __le__(self, other):
        if isinstance(other, OrderedSet) and hasattr(self._data, 'viewkeys'):
            return self._data.viewkeys() <= other._data.viewkeys()
        return super(OrderedSet, self).__le__(other)

    def add(self, value):
        self._data[value] = None

    def discard(self, value):
        self._data.pop(value, None)

    def remove(self, value):
        self._data.pop(value)

    def pop(self):
        return self._data.popitem()[0]

    def clear(self):
        self._data.clear()

    def __ior__(self, other):
        self._data.update((x, None) for x in other)
        return self

    def __iand__(self, other):
        if not isinstance(other, collections.Set):
            other = self._from_iterable(other)
        for value in list(self._data):
            if value not in other:
                self.remove(value)
        return self

    def __and__(self, other):
        if not isinstance(other, collections.Iterable):
            return NotImplemented
        if not isinstance(other, collections.Set):
            other = self._from_iterable(other)
        return self._from_iterable(value for value in self if value in other)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接