我是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), ...
谢谢!
答案 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()
方法可以用来获得类似集合的代理,而在字典上循环可以得到你钥匙按顺序。
或者您可以使用OrderedSet
和collections.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)