Удалить записи словаря, которых нет в наборе - PullRequest
2 голосов
/ 16 марта 2012

Учитывая следующий словарь и набор:

d = {1 : a, 2 : b, 3 : c, 4 : d, 5 : e }
s = set([1, 4])

Мне было интересно, можно ли удалить все словарные записи, которые не содержатся в наборе (то есть 2,3,5).Я знаю, что могу добиться этого, перебирая словарь и проверяя каждый ключ, но, поскольку я новичок в Python и наткнулся на множество «горячих клавиш», мне было интересно, существует ли такой для этой конкретной проблемы.

Ответы [ 3 ]

10 голосов
/ 16 марта 2012
d = {1 : 'a', 2 : 'b', 3 : 'c', 4 : 'd', 5 : 'e' }
s = set([1, 4])

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

Один - создать новый словарь из старого, отфильтровывая значения:

d2 = dict((k,v) for k,v in d.iteritems() if k in s)

Второй - извлечь ключи, пересечь их с набором s и использовать их для создания нового словаря:

d2 = dict((k, d[k]) for k in set(d) & s)

Третий - удалить элементы непосредственно из d:

for k in set(d) - s:
    del d[k]
3 голосов
/ 16 марта 2012

Вот два хороших решения:

d = {1 : "a", 2 : "b", 3 : "c", 4 : "d", 5 : "e" }
keep_keys = set((1, 4))

# option 1, builds a new dictionary
d2 = {key:d[key] for key in set(d) & keep_keys}

# option 2, modifies the original dictionary
map(d.__delitem__, frozenset(d) - keep_keys)

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

2 голосов
/ 16 марта 2012

Другое решение:

d = {1 : "a", 2 : "b", 3 : "c", 4 : "d", 5 : "e" }
s = set([1, 4])
r = { k:d[k] for k in ( d.viewkeys() - s ) }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...