Получить элементы, не повторяющиеся в списке - PullRequest
2 голосов
/ 30 июня 2009

Возьмите два списка, второй с теми же элементами, что и первый, и еще немного:

a = [1,2,3]
b = [1,2,3,4,5]

Я хочу получить третий, содержащий только новые элементы (не повторяющиеся):

c = [4,5]

Решение, которое у меня есть сейчас:

>>> c = []
>>> for i in ab:
...   if ab.count(i) == 1:
...     c.append(i)
>>> c
[4, 5]

Есть ли другой способ более питонический, чем этот?

Спасибо, ребята!

Ответы [ 6 ]

12 голосов
/ 30 июня 2009

по крайней мере используйте понимание списка:

[x for x in a + b if (a + b).count(x) == 1]

в противном случае используйте set class:

list(set(a).symmetric_difference(set(b)))

есть также более компактная форма:

list(set(a) ^ set(b))
8 голосов
/ 30 июня 2009

Если порядок не важен, и вы можете игнорировать повторения в пределах a и b, я бы просто использовал наборы:

>>> set(b) - set(a)
set([4, 5])

Наборы являются итеративными, поэтому в большинстве случаев вам не нужно явно преобразовывать их обратно в список. Если вам нужно, это делает это:

>>> list(set(b) - set(a))
[4, 5]
4 голосов
/ 30 июня 2009

Элементы в b, которых нет в a, если вам нужно сохранить порядок или дубликаты в b:

>>> a = [1, 2, 3]
>>> b = [1, 2, 3, 4, 4, 5]
>>> a_set = set(a)
>>> [x for x in b if x not in a_set]
[4, 4, 5]

Элементы в b, которые не находятся в a, не сохраняют порядок и не сохраняют дубликаты в b:

>>> list(set(b) - set(a))
[4, 5]
3 голосов
/ 30 июня 2009

Я бы сказал, пойти для заданного варианта, где

  set(b) ^ set(a)   (set.symmetric_difference())

применяется только в том случае, если вы можете быть уверены, что a всегда является подмножеством b, но в этом случае имеет преимущество быть коммутативным, т.е. вам не нужно беспокоиться о вычислении set (b) ^ set (a) или set (a) ^ set (b); или

  set(b) - set(a)    (set.difference())

, который более точно соответствует вашему описанию, позволяет a иметь дополнительные элементы не в b, которых не будет в наборе результатов, но вы должны учитывать порядок (set (a) - set (b) даст вам другой результат).

1 голос
/ 30 июня 2009

Вот несколько различных возможностей с наборами

>>> a = [1, 2, 3, 4, 5, 1, 2]
>>> b = [1, 2, 5, 6]
>>> print list(set(a)^set(b))
[3, 4, 6]
>>> print list(set(a)-set(b))
[3, 4]
>>> print list(set(b)-set(a))
[6]
>>> print list(set(a)-set(b))+list(set(b)-set(a))
[3, 4, 6]
>>>
0 голосов
/ 30 июня 2009

Другое решение, использующее только списки:

a = [1, 2, 3]
b = [1, 2, 3, 4, 5]
c = [n for n in a + b if n not in a or n not in b]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...