Симметричная разность множеств с использованием понимания набора (списка), не дающего ожидаемого результата - PullRequest
0 голосов
/ 09 ноября 2018

Я изучаю Python и хотел бы понять, что здесь происходит. Я уверен, что мне не хватает чего-то простого. Я получаю элементы из двух списков, которые не отображаются в обоих. Вот мой код с выводом:

    l = [1, 8, 3, 4]
    m = [4, 6, 3, 8]

    Method 1:
    r = list(set(l) - set(m)) + list(set(m) - set(l))
    [1, 6]

    Method 2:
    print [(x,y) for x in l for y in m if x not in m and y not in l]
    [(1, 6)]

    Method 3 (same but returns a list):
    print [[x,y] for x in l for y in m if x not in m and y not in l]
    [[1, 6]]

Мне бы хотелось, чтобы в списке было то же самое, что возвращено методом 1.

Кроме того, насколько я понимаю, я получаю генератор в результате кода в понимании списка. Однако я не могу превратить его в простой список:

    res = ((x,y) for x in l for y in m if x not in m and y not in l)
    print list(res)
    [(1, 6)]

Почему это? Я ожидаю:

    [1, 6]

РЕДАКТИРОВАТЬ: мой главный вопрос: почему я не могу превратить генератор из моего понимания списка выше в список? Согласно принятому ответу в этот вопрос с использованием list(res) должен работать. Я хочу понять, почему это не так.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Это потому, что вы конвертируете генератор в список!

Так что это будет эквивалентно пониманию списка !!!

Также есть еще один вариант:

list(set(l)^set(m))

Очень коротко и хорошо.

0 голосов
/ 09 ноября 2018

list(set(l) - set(m)) + list(set(m) - set(l)) - это простой способ найти симметричную разницу между двумя наборами («набор элементов, которые находятся в любом из наборов и не находятся в их пересечении» - Википедия).

>>> set(l).symmetric_difference(m)
{1, 6}

В любом случае, с пониманием списка, вот как я бы это сделал:

>>> {el for (this,other) in [(m,l),(l,m)] for el in this if el not in other}
{1, 6}

То же самое, что и

>>> symdif = set()
>>> for this,other in [(m,l),(l,m)]:
...     for el in this:
...          if el not in other:
...              symdif.add(el)
...
>>> symdif
{1, 6}

...не то, что я рекомендовал бы это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...