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 个回答
2
如果你不需要集合的特性,可以用列表来代替集合。
如果你真的想要一个有序的集合,在Python 2.7中可以使用 collections.OrderedDict
,你可以用 .viewkeys()
方法来获取一个像集合一样的代理,而遍历这个字典时会按照顺序得到键。
或者,你可以自己实现一个 OrderedSet
,使用 collections.MutableSet
和 collections.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)]