Ответ 1
Попробуйте более чистую версию?
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]
У меня есть словарь 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]]}
Попробуйте более чистую версию?
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]
Подход с использованием наборов (обратите внимание, что мне нужно было изменить переменные A, B, C и т.д. на строки и числа в вашем списке идентификаторов на фактические целые числа, также это работает, только если ваши идентификаторы уникальны и не встречаются в других "полях" ):
#!/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']}