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

13

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

<code>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)))
</code>

Я получаю:

<code>[ObjectId('4f7abaa043f1e51544000007'), ObjectId('4f7ac02543f1e51a44000001'), ObjectId('4f7aba8a43f1e51544000006')]
</code>

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

Обратите внимание, что & quot; старше & quot; означает «Python 2.3 или ранее», чтоquite намного старше Thomas Wouters
Наборы по определению неупорядочены. icktoofay
Но не так стар, как любой из нас holdenweb
И вы никогда не должны использоватьsets модуль. Используйте встроенныйset тип. Chris Morgan
sets.Set type - разумный выбор для тех, кому нужна совместимость со старыми версиями Python. Встроенныйset тип был смоделирован послеsets.Set - они оба работают нормально для большинства приложений (хотя встроенная версия работает быстрее). Raymond Hettinger

Ваш Ответ

3   ответа
4

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

или же

filter(diff.__contains__, x)
Error: 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 ExceededyError: User Rate Limit Exceededset(y)Error: User Rate Limit ExceededyError: User Rate Limit Exceeded
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)

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

Error: User Rate Limit Exceeded
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 обеспечит быстрое тестирование членства, которое сэкономит вам значительное время, если какой-либо из них будет большим.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededxError: User Rate Limit Exceeded

Похожие вопросы