Как применить некоторые операции ко многим словарям (или: как изменить словари в цикле for) в Python - PullRequest
0 голосов
/ 15 октября 2018

Если у меня есть много словарей, которые я хотел бы изменить (например, отфильтровать какое-то значение во всех них), как я могу действовать эффективным / питоническим способом?

В следующем примере:операция фильтрации внутри цикла работает, но фактические словари не изменяются / не затрагиваются:

d1 = {key:val for key, val in zip(('a', 'b', 'c', 'd', 'e'), range(5))}
d2 = {key:val for key, val in zip(('a', 'b', 'c', 'd', 'e'), range(4, 9))}

for d in (d1, d2):
    print d
    d = {key: d[key] for key in d if d[key] != 4}
    print d
print d1
print d2

# {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}
# {'a': 0, 'c': 2, 'b': 1, 'd': 3}
# {'a': 4, 'c': 6, 'b': 5, 'e': 8, 'd': 7}
# {'c': 6, 'b': 5, 'e': 8, 'd': 7}
# {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}
# {'a': 4, 'c': 6, 'b': 5, 'e': 8, 'd': 7}

1 Ответ

0 голосов
/ 15 октября 2018

Это должно сработать:

d1 = {key:val for key, val in zip(('a', 'b', 'c', 'd', 'e'), range(5))}
d2 = {key:val for key, val in zip(('a', 'b', 'c', 'd', 'e'), range(4, 9))}

dicts = [d1, d2]

print dicts
#[{'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}, {'a': 4, 'c': 6, 'b': 5, 'e': 8, 'd': 7}]

for i, d in enumerate(dicts):
    for k, v in d.items():
        if v == 4:
            del dicts[i][k]

print dicts
#[{'a': 0, 'c': 2, 'b': 1, 'd': 3}, {'c': 6, 'b': 5, 'e': 8, 'd': 7}]
print d1
#{'a': 0, 'b': 1, 'c': 2, 'd': 3}
print d2
#{'b': 5, 'c': 6, 'd': 7, 'e': 8}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...