Python: понимание списка, объединение двух списков в один с уникальными значениями - PullRequest
2 голосов
/ 21 октября 2019

Я хочу создать список, содержащий только элементы из исходного списка a, которых нет в списке b.

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

a = [3, 6, 7, 9, 11, 14, 15]

b = [2, 6, 7, 10, 12, 15]

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

Я ожидал этого результата:

[3, 9, 11, 14]

Ответы [ 5 ]

3 голосов
/ 21 октября 2019

Более простым способом было бы использование множеств.

set_a = set(a)
set_b = set(b)

c = list(set_a - set_b) #Using set operator difference
c.sort() #If you need to have it in order

Установка разности операторов

2 голосов
/ 21 октября 2019

Решение

Вы добавили слишком много кода

a = [3, 6, 7, 9, 11, 14, 15]
b = [2, 6, 7, 10, 12, 15]

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

Это дает следующий результат так же, как вы хотели !!

print(c)

# [3, 9, 11, 14]

Зачем повторять 3 раза?

Хорошо, посмотрите на исходные данные еще раз

original = [3, 6, 7, 9, 11, 14, 15]
# Index     0  1  2  3   4   5   6
#           ✓  x  x  ✓   ✓   ✓   x  

second = [2, 6, 7, 10, 12, 15]
#         0  1  2   3   4   5
#         ✓  x  x   ✓   ✓   x

Вы получите 4 уникальных числа [3, 9, 11, 14], потому что в original есть 4 числа, которых нет в second список.

Вы получаете 3 повторных номера, потому что в second есть 3 числа, которых нет в списке orginal.

Тестирование

Вы можете проверитьэта идея путем расширения списков

original = [3, 6, 7, 9, 11, 14, 15]
second = [2, 6, 7, 10, 12, 15, 100, 200]

# print(c)
# [3, 3, 3, 3, 3, 9, 9, 9, 9, 9, 11, 11, 11, 11, 11, 14, 14, 14, 14, 14]

Теперь у нас есть 5 уникальных значений в списке second, так что теперь это повторяется 5 раз!

0 голосов
/ 21 октября 2019
a = [3, 6, 7, 9, 11, 14, 15]
b = [2, 6, 7, 10, 12, 15]
c = []

for i in a:
    if i not in b:
        c.append(i)
0 голосов
/ 21 октября 2019

Если вам не нужно сохранять порядок, вы можете использовать set.difference

a = [3, 6, 7, 9, 11, 14, 15]
b = [2, 6, 7, 10, 12, 15]
c = set(a) - set(b)

Или, если вы хотите использовать понимание:

c = [n for n in a if n not in b]
0 голосов
/ 21 октября 2019

Это работает:

[*filter(lambda x: x not in b, a)]
...