Python 嵌套

有时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。正如下面的示例将演示的,嵌套是一项强大的功能。

字典列表

字典alien_0包含一个外星人的各种信息,但无法存储第二个外星人的信息,更别说屏幕上全部外星人的信息了。如何管理成群结队的外星人呢?一种办法是创建一个外星人列表,其中每个外星人都是一个字典,包含有关该外星人的各种信息。例如,下面的代码创建一个包含三个外星人的列表:

alien_0 = {'color':'green','points':5}
alien_1 = {'color':'yellow','points':10}
alien_2 = {'color':'red','points':15}
aliens = [alien_0, alien_1, alien_2] #(1)
for alien in aliens:
    print(alien)

我们首先创建了三个字典,其中每个字典都表示一个外星人。在(1)处,我们将这些字典都放到一个名为aliens的列表中。最后,我们遍历这个列表,并将每个外星人都打印出来:

{'points': 5, 'color': 'green'}
{'points': 10, 'color': 'yellow'}
{'points': 15, 'color': 'red'}

在字典中存储列表

有时候,需要将列表存储在字典中,而不是将字典存储在列表中。例如,你如何描述顾客点的比萨呢?如果使用列表,只能存储要添加的比萨配料;但如果使用字典,就不仅可在其中包含配料列表,还可包含其他有关比萨的描述。

在下面的示例中,存储了比萨的两方面信息:外皮类型和配料列表。其中的配料列表是一个与键’toppings’相关联的值。要访问该列表,我们使用字典名和键’toppings’,就像访问字典中的其他值一样。这将返回一个配料列表,而不是单个值:

# 存储所点披萨的信息
pizza = {
    'crust' : 'thick',
    'toppings' : ['mushrooms', 'extra cheese', 'coolcou']
}
# 概述所点的比萨
print("You ordered a " + pizza['crust'] + "-crust pizza" +
    "with the following toppings:")
for topping in pizza['toppings']: #(1)
    print("\t" + topping)

我们首先创建了一个字典,其中存储了有关顾客所点比萨的信息。在这个字典中,一个键是’crust’,与之相关联的值是字符串’thick’;下一个键是’toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的所有配料。制作前我们概述了顾客所点的比萨。为打印配料,我们编写了一个for循环(见(1))。为访问配料列表,我们使用了键’toppings’,这样Python将从字典中提取配料列表。

输出如下:

You ordered a thick-crust pizzawith the following toppings:
    mushrooms
    extra cheese
    coolcou

每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。

注意 列表和字典的嵌套层级不应太多。如果嵌套层级比前面的示例多得多,很可能有更简单的解决问题的方案。

在字典中存储字典

可在字典中嵌套字典,但这样做时,代码可能很快复杂起来。例如,如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键,然后将每位用户的信息存储在一个字典中,并将该字典作为与用户名相关联的值。在下面的程序中,对于每位用户,我们都存储了其三项信息:名、姓和居住地;为访问这些信息,我们遍历所有的用户名,并访问与每个用户名相关联的信息字典:

users = {
    'aeinstein' : {
        'first' : 'albert',
        'last'  : 'einstein',
        'location' : 'princeton',
    },
    'coolcou' : {
        'first' : 'marie',
        'last'  : 'curie',
        'location' : 'paris',
    },  
}
for username, user_info in users.items(): #(1)
    print("\nUsername: " + username) #(2)
    full_name = user_info['first'] + " " + user_info['last'] #(3)
    location = user_info['location']
    print("\tFull name: " + full_name.title())
    print("\tLocation: " + location.title())

我们首先定义了一个名为users的字典,其中包含两个键:用户名’aeinstein’和’mcurie’;与每个键相关联的值都是一个字典,其中包含用户的名、姓和居住地。在(1)处,我们遍历字典users,让Python依次将每个键存储在变量username中,并依次将与当前键相关联的字典存储在变量user_info中。在主循环内部的(2)处,我们将用户名打印出来。

(3)处,我们开始访问内部的字典。变量user_info包含用户信息字典,而该字典包含三个键:’first’、’last’和’location’;对于每位用户,我们都使用这些键来生成整洁的姓名和居住地,然后打印有关用户的简要信息:

Username: aeinstein
    Full name: Albert Einstein
    Location: Princeton

Username: coolcou
    Full name: Marie Curie
    Location: Paris

请注意,表示每位用户的字典的结构都相同,虽然Python并没有这样的要求,但这使得嵌套的字典处理起来更容易。倘若表示每位用户的字典都包含不同的键,for循环内部的代码将更复杂。

赞(0)

评论 抢沙发

评论前必须登录!