无法从for循环中的列表中提取字典

时间:2019-04-14 08:45:02

标签: 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:/用户/Derick/PycharmProjects/Puthon3_2019/dictionaries2.py”,行   14,在       对于k,在users_dict.items()中的v:#在此行失败AttributeError:'str'对象没有属性'items'

但是,如果我正在访问如下所示的词典,则工作正常-

print(user_list[0].items())

我给我-

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

4 个答案:

答案 0 :(得分:2)

在迭代列表时不能将其添加到列表中。 user_list.append(v)在字典列表中添加了一个字符串,由于它试图在字符串中执行.items(),因此导致下一次迭代失败。

答案 1 :(得分:2)

您将向您追加要迭代的相同列表。在下一次迭代中,for循环从列表中选择一个字符串而不是一个dict,这就是您得到错误的地方。

答案 2 :(得分:2)

正如其他人所说,您要将chqrlie$ strace ./rb612-1 ... <removed system calls related to program startup> ... open("hello_world.txt", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e356ed000 fstat(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 lseek(3, 0, SEEK_SET) = 0 read(3, "Hello world!", 12) = 12 lseek(3, 12, SEEK_SET) = 12 read(3, "", 100) = 0 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e356ec000 write(1, "\n", 1 ) = 1 write(1, "read(fileno(fp), buffer, 100) = "..., 55read(fileno(fp), buffer, 100) = 0, Buffer: '', sz = 12 ) = 55 close(3) = 0 munmap(0x7f5e356ed000, 4096) = 0 open("hello_world.txt", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5e356ed000 fstat(3, {st_mode=S_IFREG|0644, st_size=12, ...}) = 0 lseek(3, 0, SEEK_SET) = 0 read(3, "Hello world!", 13) = 12 lseek(3, 1, SEEK_CUR) = 13 lseek(3, 0, SEEK_SET) = 0 read(3, "Hello world!", 100) = 12 write(1, "\n", 1 ) = 1 write(1, "read(fileno(fp), buffer, 100) = "..., 68read(fileno(fp), buffer, 100) = 12, Buffer: 'Hello world!', sz = ) = 68 close(3) = 0 munmap(0x7f5e356ed000, 4096) = 0 (这是一个字符串)附加到要由dict组成的要迭代的列表中,以字符串和字典的混合结尾,这是不可取的。我认为这是一种错字,可以通过简单的方式解决:

v

或更好:

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']

答案 3 :(得分:1)

原因是您在迭代中向str添加了user_list

user_list.append(v)

在python中,在遍历list的同时进行编辑,而list将迭代附加到其上的新内容。

例如,我们可以使用list进行bfs,同时遍历和编辑。

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