Python - 遍历多维字典

9

如果我解释我认为自己在做什么,希望有人能解释我哪里错了。

我有以下字典:

ls = [{
    'The Wolf Gift (13)': {
        'cover': 'V:\\Books\\Anne Rice\\The Wolf Gift (13)\\cover.jpg',
        'author': 'Anne Rice',
        'year': '1988'
    },
    'Mummy (14)': {
        'cover': 'V:\\Books\\Anne Rice\\Mummy (14)\\cover.jpg',
        'author': 'Anne Rice',
        'year': '1989'
    },
}]

首先,上面的是一个多维字典吗?我想确定我说的是正确的东西。其次,如何循环遍历它以检索不同级别的信息。该字典是动态生成的,因此我事先不知道键。
我尝试过使用for book in ls,然后book['cover']等,但似乎不起作用。我需要书名,然后是每本书的其他信息(封面等)。我对Python相当陌生。我来自PHP,使用数组是我的拿手好戏,但Python正在折磨我...
谢谢

1
你有一个只包含一个字典的列表,该字典的键是书名,值是另一个字典... - Jon Clements
4个回答

7
这是一个示例,如果ls包含多个字典,可以使用它。
for dic in ls:
    for key in dic:
        print 'Book Name: %s' % (key)
        for value in dic[key]:
            print '\t%s: %s' % (value, dic[key][value])

这将产生以下输出:
Book Name: Mummy (14)
    year: 1989
    cover: V:\Books\Anne Rice\Mummy (14)\cover.jpg
    author: Anne Rice
Book Name: The Wolf Gift (13)
    year: 1988
    cover: V:\Books\Anne Rice\The Wolf Gift (13)\cover.jpg
    author: Anne Rice

或者你可以删除最后的for循环,直接像这样访问键:
for dic in ls:
    for key in dic:
        print 'Book Name: %s' % (key)
        print 'Publish Year: %s' % dic[key]['year']

这将会输出以下内容:

Book Name: Mummy (14)
Publish Year: 1989
Book Name: The Wolf Gift (13)
Publish Year: 1988

5

这是一个只包含一个字典的列表。你可以这样操作:

>>> books = ls[0]
>>> for book, details in books.iteritems():
        print book,'-->', details['cover']
...     
Mummy (14) --> V:\Books\Anne Rice\Mummy (14)\cover.jpg
The Wolf Gift (13) --> V:\Books\Anne Rice\The Wolf Gift (13)\cover.jpg

1
很好,我明白了。顺便问一下,因为我很快就会遇到它。如果它有三个层级呢?所以cover也包含另一个字典front:back:,例如...那么我该如何循环遍历呢? - superphonic
1
@superphonic 在循环中迭代它,做:for cover,value in details['cover'].items():#do something. 如果你确定 details['cover'] 的键,那么你也可以直接访问它们:details['cover']['front']... - Ashwini Chaudhary

4

ls是一个包含字典的列表。这个字典包含键,这些键是书籍,而值是字典。因此,您可以像这样访问它们:

for book in ls[0]:
    covername = ls[0][book]['cover']
    print(covername) 

输出如下:

V:\Books\Anne Rice\The Wolf Gift (13)\cover.jpg
V:\Books\Anne Rice\Mummy (14)\cover.jpg

ls[0] 指的是列表中的第一个元素

[book] 是因为正在迭代字典的键

['cover'] 是从由 [book] 引用的字典中读取的元素


3

首先,你的字典实际上是一个包含字典的列表(在声明时使用了[]),这可能会成为一个问题。一旦你知道了这一点,就很容易得到你想要的所有信息。例如:

for key in ls[0].keys():
     print ls[0][key]

或者,如果您想访问关于每本书的特定详细信息(包含在最外层字典中持有每本书的另一个字典中):
for bookKey in ls[0].keys():
     print ls[0][bookKey]['cover']
     print ls[0][bookKey]['author']
     print ls[0][bookKey]['year']

希望这可以帮到您。也许考虑将所有内容中的列表删除,这样会使您的生活更加轻松(少用一个索引) 。

感谢您清晰的解释。您说得对,它是一个包含字典的列表,这让我在尝试访问元素时感到困惑... - superphonic
我想象一下 :) 祝你的项目和Python好运。它是一种愉快的语言(尽管有时相当简单)。 - Aleksander Lidtke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接