#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