python王者归来—学习笔记(11)

第九章 字典(字典定义与增删改查、字典元素遍历、字典列表、列表字典、嵌套字典、字典常用函数和方法-len-fromkeys-get-setdefault-pop)

列表(list)与元组(tuple)是依序排列可称是序列数据结构,只要知道元素的特定位置,即可使用索引观念取得元素内容。字典(dict)并不是依序排列的数据结构,通常可称是非序列数据结构,所以无法使用类似列表的数值(0, 1, …n)索引观念取得元素内容。

一、字典定义。字典也是一个列表型的数据结构,但是它的元素是用“键-值”方式配对存储,在操作时是用键(key)取得值(value)的内容。字典的值(value)可以是任何Python的对象,所以可以是数值、字符串、列表等。定义字典时,是将键-值放在大括号“{ }”内:name_dict = {key1:value1,  ..., keyn:valuen}

字典的元素是“键-值”配对设定,如果想要取得元素的值,可以将键当作是索引方式处理(value = name_dict[key]),因此字典内的元素不可有重复的键。

可使用下列语法格式增加字典元素:name_dict[key],如果原来字典中已存在该键值,则对应值会被更新。

fruits = {'西瓜':15, '香蕉':20, '水蜜桃':25}
print("旧价格香蕉一斤 ", fruits['香蕉'], ' 元')
fruits['香蕉'] = 12
print("新价格香蕉一斤 ", fruits['香蕉'], ' 元')

如果想要删除字典的特定元素,它的语法格式如下:del name_dict[key]。如果想要将字典的所有元素删除,可以使用name_dict.clear()清除,此时字典仍然存在,不过将变成空的字典。如果想要将整个字典删除,可以使用 del name_dict 进行删除,字典一经删除就不再存在,不能再后续任何地方使用了。

在程序设计时,也允许先建立一个空字典,建立空字典的语法如下:name_dict = {},然后可以使用name_dict[key]增加字典元素。

在大型程序开发过程,有时为了要保护原先字典内容,所以常会需要将字典复制,此时可以使用 new_dict = name_dict.copy(),上述所复制的字典是独立存在新地址的字典,属于深拷贝。

在列表(list)或元组(tuple)使用的方法len(name_dict)也可以应用在字典中获取字典元素数量。

可以用下列语法验证元素是否存在:key in name_dict。可以用来判断字典元素是否已存在,以便决定是否需要新增字典元素。

fruits = {'西瓜':15, '香蕉':20, '水蜜桃':25}
key = '苹果'
value = 12
if key in fruits:
    print("%s已经在字典中了" % key)
else:
    fruits[key] = value
    print("新的水果字典为:", fruits)

设计大型程序时,字典的元素内容很可能是由长字符串所组成,碰上这类情况建议一行定义一个元素:

players = {'Stephen Curry':'Golden State Warriors',
           'Kevin Durant':'Golden State Warriors',
           'James Harden':'Houston Rockets'}

二、字典元素遍历。Python有提供方法items( ),可以让我们取得字典键-值配对的元素。有时候我们不想要取得字典的值(value),只想要键(keys),Python有提供方法keys( ),可以让我们取得字典的键内容。Python有提供方法values( ),可以让我们取得字典值内容。

players = {'Stephen Curry':'Golden State Warriors',
           'Kevin Durant':'Golden State Warriors',
           'James Harden':'Houston Rockets'}
print(players)

#打印字典键值对
for player, team in players.items():
    print("\nname: ", player)
    print("team: ", team)

print()
#打印键内容
for name in players.keys():  #也可以省略keys( )方法,而获得一样的结果
    print(name)

print()
#打印值内容
for team in players.values(): #在字典的应用中键不可有重复,值是可以重复
    print(team)

print()
#使用集合中的set( )函数去除重复值
for team in set(players.values()): 
    print(team)


print()
#使用sorted()函数排序
for name in sorted(players.keys()):
    print(name)

因为字典(dict)是一个无序的数据结构,Python只会保持键-值,不会关注元素的排列顺序,因此打印输出的顺序有可能和定义顺序不同。

三、字典列表、列表字典、嵌套字典。以下一个例子建立了一个字典列表,即列表内元素是字典:

armys = []  #建立小兵空列表
#建立50个小兵
for number in range(50):
    soldier = {'tag':'red', 'score':3, 'speed':'slow'}
    armys.append(soldier)
#打印前三个小兵
print("前3名小兵资料:")
for soldier in armys[:3]:
    print(soldier)
#打印小兵数量
print("小兵数量:", len(armys))

#更改编号36到38的小兵(小兵编号从1开始)
print("编号35到40小兵数据:")
for soldier in armys[35:38]:
    if soldier['tag'] == 'red':
        soldier['tag'] = 'blue'
        soldier['score'] = 5
        soldier['speed'] = 'medium'
#打印编号35到40的小兵
for soldier in armys[34:40]:
    print(soldier)

在Python的应用中也允许将列表放在字典内,这时列表将是字典某键的值。如果想要遍历这类数据结构,需要使用嵌套循环和字典的方法items( ),外层循环是取得字典的键,内层循环则是将含列表的值拆解:

#字典内含有列表
sports = {'curry':['篮球', '足球'],
          'durant':['棒球'],
          'james':['足球', '棒球']}

for name, favorite_sport in sports.items():
    print("%s喜欢的运动是:" % name)
    for sport in favorite_sport:
        print("  ", sport)

在Python的应用中也允许将字典放在字典内,这时字典将是字典某键的值。至于打印方式一样需使用items( )函数:

#建立内含字典的字典
wechat_account = {'cshung':{
                        'last_name':'hong',
                        'first_name':'jinkui',
                        'city':'taining'},
                  'kevin':{
                        'last_name':'zheng',
                        'first_name':'yimeng',
                        'city':'beijing'}}
#打印内含字典的字典
for acount, info in wechat_account.items():
    print("使用者账号:", acount)
    name = info['last_name'] + ' ' + info['first_name']
    print("姓名:", name)
    print("城市:", info['city'])

while循环在字典中的应用:

survey_dict = {}  #市场调查空字典
market_survey = True  #设定循环布尔值

while market_survey:
    name = input("\n请输入姓名:")
    travel_location = input("请输入旅游景点:")
    survey_dict[name] = travel_location  #将输入存入字典

    repeat = input("是否有人继续参加市场调查(y/n):")
    if repeat != 'y':   #输入不是y,离开while循环
        market_survey = False

#市场调查结束,打印输出
for user, location in survey_dict.items():
    print(user, '旅游景点:', location)

四、字典常用函数和方法如下:

1、len(name_dict):列出字典元素的个数。

2、fromkeys( ):这是建立字典的一个方法,它的语法格式为 name_dict = dict.fromkeys(seq [, value=None]) 。 上述会使用seq序列建立字典,序列内容将是字典的键,如果没有设定value则用None当字典键的值:

#列表转成字典
seq1 = ['name', 'city']
list_dict1 = dict.fromkeys(seq1)
print("字典1:", list_dict1)
list_dict2 = dict.fromkeys(seq1, 'Chicago')
print("字典2:", list_dict2)

#元组转成字典
seq2 = ('name', 'city')
tuple_dict1 = dict.fromkeys(seq2)
print("字典1:", tuple_dict1)
tuple_dict2 = dict.fromkeys(seq2, 'Chicago')
print("字典2:", tuple_dict2)

#列表和元组转成字典
seq3 = ('hello', 'world')
dicts = dict.fromkeys(seq1, seq3)
print("字典3:", dicts)

3、get():搜寻字典的键,如果键存在则传回该键的值,如果不存在则传回默认值,语法格式为 ret_value = name_dict.get(key[, default=None])。其中key是要搜寻的键,如果找不到key则传回default的值(如果没设定就传回None)。

fruits = {'apple':35, 'orange': 18}
value1 = fruits.get('orange')
print("value1: ", value1)
value2 = fruits.get('grape')
print("value2: ", value2)
value3 = fruits.get('grape', 22)
print("value3: ", value3)

4、setdefault( ):这个方法基本上与get( )相同,不同之处在于get( )方法不会改变字典内容。使用setdefault( )方法时若所搜寻的键不在,会将键-值加入字典,如果有设定默认值则将键:默认值加入字典,如果没有设定默认值则将键:None加入字典。语法格式为:

ret_value = name_dict.setdefault(key[, default=None])

person = {'name':'john'}
#键存在字典中
ret_value1 = person.setdefault('name')
print("ret_value1: ", ret_value1)
print(person)

#键不在字典中,未设置默认值
age = person.setdefault('age')
print("age: ", age)
print(person)

#键不在字典中,有设置默认值
sex = person.setdefault('sex', 'male')
print("sex: ", sex)
print(person)

5、pop( ):这个方法可以删除字典元素,语法格式为:ret_value = name_dict.pop(key[, default])。其中key是要搜寻删除的元素的键,找到时就将该元素从字典内删除,同时将删除键的值回传。当找不到key时则传回default设定的内容,如果没有设定则传回KeyError

fruits = {'apple':35, 'orange': 18, 'banana': 22}
print(fruits)
#元素存在时pop
ret_value1 = fruits.pop('orange')
print("ret_value1: ", ret_value1)
ret_value2 = fruits.pop('apple', 'does not exist')
print("ret_value2: ", ret_value2)
print(fruits)

#元素不存在时pop
ret_value3 = fruits.pop('organe', 'does not exist')
print("ret_value3: ", ret_value3)

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值