在Python中打印集合结果的顺序

时间:2011-01-28 21:38:10

标签: python

我是Python的新手。我有一个问题。有人可以帮助我。

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

>>> 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 个答案:

答案 0 :(得分:10)

你是对的,一个集合不会按排序顺序存储它的元素。如果要按排序顺序获取集合中的元素列表,可以使用内置函数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)]

答案 1 :(得分:2)

如果您不需要设置功能,则可以使用列表而不是集合。

如果你真的想要一个有序的集合,在Python 2.7上你可以使用collections.OrderedDict.viewkeys()方法可以用来获得类似集合的代理,而在字典上循环可以得到你钥匙按顺序。

或者您可以使用OrderedSetcollections.MutableSet(或者如果您使用的是Python 2.6的OrderedDict的其他实现)实现自己的collections.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)