Как я могу перебрать словарь, длина которого изменяется в python? - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть словарь, который я хочу перебрать и изменить его значение, но я думаю, что изменение длины может привести к ошибке, есть ли хорошие способы сделать это?

пример:

d = {'a':'orange','b':'pineapple','c':'dragonfruit'}
rating = {'orange':3, 'pineapple':4, 'dragonfruit':4.5, 'apple':3, 'pear': 3.5}

for key, value in d.items():
    if some conditions met:
        del d['a'] or d['e']='apple' # (or is not operator, i mean literally one of the operation add or delete item...)

например:

for key, value in d.items():
    if rating[value]<4:
        del d[key]

или

d = {'a':['orange'],'b':['pineapple','peach'],'c':['dragonfruit']}
rating = {'orange':3, 'pineapple':4, 'dragonfruit':4.5, 'apple':3, 'pear': 3.5, 'peach': 5}
for key, value in d.items():
    rating_sum = sum([ rating[v] for v in value])
    if rating_sum > 8 and len(value)>1:
        d['e'] = d[key].pop(-1)

вероятно, не лучший пример ... означает, что длина словаря изменяется в цикле.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Вы можете скопировать ваш dict в некоторую временную переменную dict, а затем выполнить итерацию по временному dict, но внося изменения в оригинал.

temp = dict.copy()

for key, value in temp.items():
    if some conditions met:
        del dict['a'] or dict['e']='apple'
0 голосов
/ 06 декабря 2018

Не.Это не невозможно, но в большинстве случаев нет причин не создавать новый словарь и переназначать имя, которое легче писать и читать.

d = <SOME-DICT>
# filter d with dict comprehension, reassign the name d
d = {k:v for k,v in d.items() if <FILTERING-CONDITION>}

Некоторые демонстрационные примеры ::

>>> d = {'a':'orange','b':'pineapple','c':'dragonfruit'}
>>> {k:v for k,v in d.items() if v != 'pineapple'}
{'a': 'orange', 'c': 'dragonfruit'}
>>> {k:v for k,v in d.items() if not (k == 'd' and v == 'dragonfruit')}
{'a': 'orange', 'b': 'pineapple', 'c': 'dragonfruit'}
>>> {k:v for k,v in d.items() if not (k == 'c' and v == 'dragonfruit')}
{'a': 'orange', 'b': 'pineapple'}
>>> {k:v for k,v in d.items() if not (k == 'a' or (k == 'e' and v == 'pineapple'))}
{'b': 'pineapple', 'c': 'dragonfruit'}
0 голосов
/ 06 декабря 2018

Не добавляйте и не удаляйте ключи, пока вы повторяете свой словарь.Кроме того, не создавайте теней для встроенного dict.

. Вы можете использовать словарь со всеми условиями:

d = {k: v for k, v in d.items() if \
     not (conditions and \
     ((k == 'a') or ((k, v) == ('e', 'apple'))))}

Я полагаю, что conditions является функцией k и v, в противном случае вы должны вычислить и применить этот тест вне понимания словаря.

Но это может немного запутаться, поэтому разделение вашей логики на функцию не повредит:

def keep_pair(k, v):
    if conditions:
        if (k == 'a') or ((k, v) == ('e', 'apple')):
            return False
    return True

d = {k, v for k, v in d.items() if keep_pair(k, v)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...