Как мне не получить дубликаты в этом списке понимания? - PullRequest
0 голосов
/ 25 мая 2019

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

Я попытался использовать понимание списка в тесте if, как я покажу в коде.Я также попытался использовать оператор and, но это не сработало.

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
c = [x for x in a if x in b]

Это текущее решение, которое у меня есть, 'Я также пытался изменить понимание списка c на:

c = [x for x in a if x in b and x not in c]

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

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Если вы хотите новый список всех элементов, которые появляются в любом из 2 исходных списков, вы можете использовать класс set для достижения этого. Может быть так:

>>> a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
>>> b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

>>> list(sorted(set(a) | set(b)))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 21, 34, 55, 89]

Для этого нужно построить 2 набора из списков, затем найти объединение всех элементов и затем преобразовать результат обратно в список.

Этот подход будет быстрее, чем проверка elem for elem in a if elem in b для больших списков, потому что тесты членства O(1) для наборов, но до O(n) для списков.

1 голос
/ 25 мая 2019

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

c = [x for x in a if x in b] не работает, так как повторяющиеся элементы в a все еще содержатся в b и, следовательно, не исключаются вашим оператором if. (1 дублируется в a, но оба элемента будут содержаться в c по вашему первому определению, поскольку 1 в b).

РЕДАКТИРОВАТЬ: если вы хотите просто изменить свое понимание списка, но продолжать использовать его, вы можете сделать что-то вроде: c = [x for x in set(a) if x in b]

0 голосов
/ 25 мая 2019

Я представлю немного другое решение: идея состоит в том, чтобы сначала посчитать частоту чисел с помощью Counter, а затем выполнить понимание списка с помощью клавиш. Поскольку Counter возвращает словарь, у вас не будет дубликатов ключей.

from collections import Counter

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

f1 = Counter(a)
f2 = Counter(b)

c = [x for x in f1.keys() if x in f2.keys()]
# [1, 2, 3, 5, 8, 13]
...