2011-01-28 7 views
5

Soy nuevo en Python. Tengo una pregunta. Alguien podría ayudarme.el orden en que se imprime el resultado de un conjunto en Python

hago lo siguiente en el símbolo del sistema:

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

la respuesta que recibo al imprimir es la siguiente:

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

entiendo que la impresión de los resultados en el forma en que está almacenado. Pero, ¿hay alguna manera de que pueda ordenarlo? Digamos por ejemplo de esta manera:

(0,7), (1,7), (2,7), (3,7), ... 

Gracias!

Respuesta

9

Tiene razón en que un conjunto no almacena sus elementos en orden ordenado. Si desea obtener una lista de los elementos en el conjunto en orden de clasificación se puede utilizar la función incorporada 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

Se puede utilizar una lista en lugar de un conjunto si no se necesita el conjunto caracteristicas.

Si realmente desea un conjunto ordenado, en Python 2.7 puede usar collections.OrderedDict, el método se puede utilizar para obtener un proxy similar a un conjunto, mientras que al pasar por encima del diccionario obtendrá las claves en orden.

O puede implementar su propio OrderedSet utilizando collections.MutableSet y collections.OrderedDict (u otra implementación de OrderedDict si tiene Python 2.6).

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) 
Cuestiones relacionadas