Как изменить словарь, перебирая его ключи, перебирая список - PullRequest
0 голосов
/ 12 января 2019
  1. У меня есть список l.
  2. У меня есть словарь d.

Я хочу перебрать l. Для любого элемента списка я хочу перебрать d.keys.

Если какое-то условие выполнено, я бы хотел «обновить» свой словарь.

Я наивно пытался вложить два цикла for и вставить оператор if - Нельзя изменить длину объекта, над которым он повторяется.

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}

l = ['A', 'B', 'C', 'D', 'E']

for word in l:
    for key in d.keys():
        if len(key) < 2:#some condition
            d.pop(key)
        else:
            print(word, key)

Это вывод, который я получаю:

A this
A is
Traceback (most recent call last):
  File "untitled3.py", line 6, in <module>
    for key in d.keys():
RuntimeError: dictionary changed size during iteration

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Вместо зацикливания на d вы можете зациклить на копии.

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}

l = ['A', 'B', 'C', 'D', 'E']

for word in l:
    for key in d.copy().keys(): # Notice the change
        if len(key) < 2:#some condition
            d.pop(key)
        else:
            print(word, key)
0 голосов
/ 12 января 2019

Вы не должны изменять размер словаря во время итерации по представлению этого словаря. Вместо этого вы можете создать новый словарь и , а затем напечатать все, что захотите. Например:

d = {'this': '1', 'is': '2', 'a': '3', 'list': '4'}
L = ['A', 'B', 'C', 'D', 'E']

d_new = {k: v for k, v in d.items() if len(k) >= 2}

for word in L:
    for key in d_new:
        print(word, key)

Как описано в документах :

Объекты, возвращаемые dict.keys(), dict.values() и dict.items() являются объектами просмотра. Они обеспечивают динамический взгляд на словарные записи, что означает, что когда словарь изменяется, вид отражает эти изменения .... Итерации при добавлении или удалении записей в словаре могут выдает RuntimeError или не может перебрать все записи.

...