сохраняя определенные значения из списка и диктовать - PullRequest
0 голосов
/ 01 октября 2019

У меня есть dict d

d = {'A1': ['Mike', 'Mouse'],
 'A2': ['Don', 'Duck'],
 'A3': ['Bart','Simp']}

и список l

l = ['Sar', 'Mike', 'Duck', 'Hox12', 'Bart', '10r']

Моя цель - создать новый список new_l, который не имеетэлементы в l например Mike, которые также находятся в d например 'A1': ['Mike', 'Mouse'].

Я бы хотел, чтобы мой new_l был

new_l = ['Sar', 'Hox12', '10r]

Я пробовал

new_l = []
for k, v in d.items():
    if v not in l:
        new_l.append(v)

и

new_l = []
for names in l:
    if names not in v in d.items():
        new_l.append(names)

Но они оба делаютне дать мне желаемый результат.

Как мне изменить код, чтобы получить желаемый new_l?

Ответы [ 3 ]

1 голос
/ 01 октября 2019

используйте функцию расширения для подготовки списка с использованием значений dict.

new_l = []
d = {'A1': ['Mike', 'Mouse'],
 'A2': ['Don', 'Duck'],
 'A3': ['Bart','Simp']}
l = ['Sar', 'Mike', 'Duck', 'Hox12', 'Bart', '10r']
to_cmp_l = []
for k,v in d.items():
    to_cmp_l.extend(v)
for item in l:
    if item not in to_cmp_l:
        new_l.append(item)
print(new_l)
1 голос
/ 01 октября 2019

Вы также можете попробовать этот однострочник:

new_l = reduce(list.__add__, [list(set(items) - set(l)) for items in d.values()])
1 голос
/ 01 октября 2019
s = set()
for v in d.values():
    s |= set(v)
new_l = [e in l if e not in s]

преобразовать каждое значение в набор и построить набор всех значений в словаре. Создайте новый список, проверив членство в наборе.

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

|= - сокращение для добавления элементов в существующий набор. Docs

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