Python中集合结果的输出顺序

7 投票
2 回答
11874 浏览
提问于 2025-04-16 10:48

我在命令提示符下做了以下操作:

>>> 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 个回答

2

如果你不需要集合的特性,可以用列表来代替集合。

如果你真的想要一个有序的集合,在Python 2.7中可以使用 collections.OrderedDict,你可以用 .viewkeys() 方法来获取一个像集合一样的代理,而遍历这个字典时会按照顺序得到键。

或者,你可以自己实现一个 OrderedSet,使用 collections.MutableSetcollections.OrderedDict(如果你用的是Python 2.6,也可以用其他的OrderedDict实现)。

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)
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)]

撰写回答