Итерация словаря Python - PullRequest
       3

Итерация словаря Python

21 голосов
/ 13 июня 2011

У меня есть словарь dict2, который я хочу просмотреть и удалить все записи, которые содержат определенные идентификационные номера в idlist.dict2[x] - это список списков (см. Пример dict2 ниже).Это код, который я написал до сих пор, однако он не удаляет все экземпляры идентификаторов (entry[1]), которые находятся в idlist.Любая помощь?

dict2 = {G1:[[A, '123456', C, D], [A, '654321', C, D], [A, '456123', C, D], [A, '321654', C, D]]}

idlist = ['123456','456123','321654']
for x in dict2.keys():
    for entry in dict2[x]:
        if entry[1] in idlist:
            dict2[x].remove(entry)
        if dict2[x] == []:
            del dict2[x]

dict2 должно выглядеть так:

dict2 = {G1:[[A, '654321', C, D]]}

Ответы [ 2 ]

34 голосов
/ 13 июня 2011

Попробуйте более чистую версию, возможно?

for k in dict2.keys():
    dict2[k] = [x for x in dict2[k] if x[1] not in idlist]
    if not dict2[k]:
        del dict2[k]
15 голосов
/ 13 июня 2011

Подход, использующий наборы (обратите внимание, что мне нужно было изменить ваши переменные A, B, C и т. Д. На строки, а числа в вашем idlist на действительные целые числа; это также работает, только если ваши идентификаторы уникальны и не встречаются в других «полях»):

#!/usr/bin/env python
# 2.6 <= python version < 3

original = {
    'G1' : [
        ['A', 123456, 'C', 'D'], 
        ['A', 654321, 'C', 'D'], 
        ['A', 456123, 'C', 'D'], 
        ['A', 321654, 'C', 'D'],
    ]
}

idlist = [123456, 456123, 321654]
idset = set(idlist)

filtered = dict()

for key, value in original.items():
    for quad in value:
        # decide membership on whether intersection is empty or not
        if not set(quad) & idset:
            try:
                filtered[key].append(quad)
            except KeyError:
                filtered[key] = quad

print filtered
# would print:
# {'G1': ['A', 654321, 'C', 'D']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...