13

Вопрос по set, python – Сохранение порядка при использовании разницы в наборах Python

Я делаю операцию установки различий в Python:

from sets import Set
from mongokit import ObjectId
x = [ObjectId("4f7aba8a43f1e51544000006"), ObjectId("4f7abaa043f1e51544000007"), ObjectId("4f7ac02543f1e51a44000001")]
y = [ObjectId("4f7acde943f1e51fb6000003")]
print list(Set(x).difference(Set(y)))

Я получаю:

[ObjectId('4f7abaa043f1e51544000007'), ObjectId('4f7ac02543f1e51a44000001'), ObjectId('4f7aba8a43f1e51544000006')]

Мне нужно получить первый элемент для следующей операции, что важно. Как я могу сохранить списокx в оригинальном формате?

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededxError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededyError: User Rate Limit Exceededset(y)Error: User Rate Limit ExceededyError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededfilterError: User Rate Limit Exceededlist()Error: User Rate Limit Exceededfilter().

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • И вы никогда не должны использоватьsets модуль. Используйте встроенныйset тип.

    от Chris Morgan
  • sets.Set type - разумный выбор для тех, кому нужна совместимость со старыми версиями Python. Встроенныйset тип был смоделирован послеsets.Set - они оба работают нормально для большинства приложений (хотя встроенная версия работает быстрее).

    от Raymond Hettinger
  • Но не так стар, как любой из нас

    от holdenweb
  • Обратите внимание, что & quot; старше & quot; означает «Python 2.3 или ранее», чтоquite намного старше

    от Thomas Wouters
  • Наборы по определению неупорядочены.

    от icktoofay
  • 4

    Вы могли бы просто сделать это

    diff = set(x) - set(y)
    [item for item in x if item in diff]
    

    или же

    filter(diff.__contains__, x)
    

  • 19

    Похоже, вам нужен упорядоченный набор вместо обычного набора.

    >>> x = [ObjectId("4f7aba8a43f1e51544000006"), ObjectId("4f7abaa043f1e51544000007"), ObjectId("4f7ac02543f1e51a44000001")]
    >>> y = [ObjectId("4f7acde943f1e51fb6000003")]
    >>> print list(OrderedSet(x) - OrderedSet(y))
    [ObjectId("4f7aba8a43f1e51544000006"), ObjectId("4f7abaa043f1e51544000007"), ObjectId("4f7ac02543f1e51a44000001")]
    

    Python не поставляется с упорядоченным набором, но его легко сделать:

    import collections
    
    class OrderedSet(collections.Set):
    
        def __init__(self, iterable=()):
            self.d = collections.OrderedDict.fromkeys(iterable)
    
        def __len__(self):
            return len(self.d)
    
        def __contains__(self, element):
            return element in self.d
    
        def __iter__(self):
            return iter(self.d)
    

    Надеюсь это поможет :-)

  • 13

    Наборы неупорядочены

    поэтому вам нужно будет вернуть результаты в правильном порядке после внесения разницы в наборы. К счастью, у вас уже есть элементы в нужном вам порядке, так что это легко.

    diff = set(x) - set(y)
    result = [o for o in x if o in diff]
    

    Но это может быть упрощено; Вы можете сделать разницу как часть понимания списка (хотя, возможно, немного менее ясно, что это то, что вы делаете).

    sety = set(y)
    result = [o for o in x if o not in sety]
    

    Вы даже можете сделать это без созданияset отy, ноset обеспечит быстрое тестирование членства, которое сэкономит вам значительное время, если какой-либо из них будет большим.