Невозможно извлечь словарь из списка в цикле for

#python #python-3.x

#python #python-3.x

Вопрос:

Я хочу перебрать список словарей, но это дает мне AttributeError

Вот мой код —

 user_list = []
new_user = { 'last': 'fermi',
             'first': 'enrico',
             'username': 'efermi', }
user_list.append(new_user)


new_user = { 'last': 'fermi2',
             'first': 'enrico2',
             'username': 'efermi2', }
user_list.append(new_user)

for users_dict in user_list:
    for k, v in users_dict.items(): # fails at this line
        if(k == 'username'):
            user_list.append(v)
 

Исключение

Трассировка (последний последний вызов): файл «C:/Users/Derick/PycharmProjects/Puthon3_2019/dictionaries2.py «, строка 14, для k, v в users_dict.items(): # сбой в этой строке AttributeError: объект ‘str’ не имеет атрибута ‘items’

Однако, если я обращаюсь к словарю, как показано ниже, он работает нормально —

 print(user_list[0].items())
 

Я даю мне —

 dict_items([('last', 'fermi'), ('first', 'enrico'), ('username', 'efermi')])
 

Ответ №1:

Вы не можете добавлять в список во время итерации по нему. user_list.append(v) добавляет строку в список словарей, и это приводит к сбою следующей итерации, потому что она пытается выполнить .items() в строке.

Ответ №2:

Вы добавляете тот же список, который вы повторяете. На какой-то следующей итерации цикл for выбирает строку вместо dict из этого списка, и именно здесь вы получаете ошибку.

Ответ №3:

Как говорили другие, вы добавляете v строку в список, который вы повторяете, как составленный dicts, заканчивающийся смесью строк и словарей, что нежелательно. Я думаю, что это была своего рода опечатка, которую можно исправить простым:

 usernames = []
for users_dict in user_list:
    for k, v in users_dict.items(): # fails at this line
        if(k == 'username'):
            usernames.append(v)
usernames
>>> ['efermi', 'efermi2']

 

или лучше:

 usernames = [x["username"] for x in user_list]
 

Ответ №4:

причина в том, что вы добавили str user_list в итерацию:

 user_list.append(v)
 

в python редактирование во время обхода list разрешено, и list оно повторит новое содержимое, добавленное к нему.

например, мы можем использовать list для одновременного выполнения bfs, обхода и редактирования.

     for node in bfs:
        bfs  = node.successor
    return bfs