7

Hello ,同为小白的朋友们大家好,这期主要为大家带来有关字典的一些实用技巧。上篇笔记通过感人肺腑的老白让大家认识到了字典这么有用的数据类型,这一期让我们看看如何能更好的操作字典。

基础篇

下面我给大家来一个简单的字典方法汇总,诚意满满,希望大家喜欢,如果有错误或者遗漏希望大神可以补上~

创建字典,得到字典中的键值,新增,修改,删除,清空字典
stocks ={'IBM':146,            # 创建字典
         'MSFT':44,
         'MAOTAI':1000}

stocks['IBM']                  # 查询字典中的一个值  Out:146
stocks.get('MSFT')             # 查询字典中的一个值  Out:44
stocks.get('a','Not found')    # 查询字典中的一个值,如果没有,返回 Not found
stocks['a']                    # 抛出错误,因为字典中没有这个值
stocks['IBM']=200              # 修改值
stocks['APPLE']=400            # 新增键和值
stocks.update({'APPLE':900,
               'MAOTAI':0,
               'MSFT':250})    # 一次修改多个值

del stocks['APPLE']            # 删除一个值
stocks.pop['MAOTAI']           # 删除并返回删除的值
stocks.keys()                  # 获得字典的所有键
stocks.values()                # 获得字典的所有值
stocks.items()                 # 获得字典的所有键和值,形式为 (key,value)

for k,v in stocks.items():     # 遍历一个字典,输出它的键和值
    print(k,v)                          

stocks.clear()                 #清空一个字典,让字典为空
del stocks                     #直接删除一个字典

好啦,基础方法就这么多大概,这里创建了一个stocks字典用来表示股票名称和价钱,然后在基础上举例子的,有两点需要大家注意:

  • 一次更新多个值的时候用update()方法会很方便
  • 如果利用dict[key]的方式获取一个字典中不存在的值会报错,正确做法是用get()函数,效果好很多

奇淫巧技篇

创建字典歪门邪道之一: list + zip

除了常规的方式,还有很多其他方式可以帮助我们创建一个字典,比如我们这里想要创建一个字典来表示一个学生的各科成绩:

subject=['Math','Chinese','English','Science','Art']
marks=[80,78,96,60,75]

final_result=dict(zip(subject,marks))
print(final_result.items())

Out: dict_items([('Math', 80), ('Chinese', 78), ('English', 96), ('Science', 60), ('Art', 75)])

这里其实很容易看懂,我们把subject的所有值作为key值,把marks所有值看成values的值,最后用Python很常见的zip就啪啪啪的将他们合并啦,形成了一个新的字典final_result

创建字典歪门邪道之二: 利用等号

上面的字典还可以通过这种形式来创建;

final_result= dict(Math=80,Chinese=78,English=96,Science=60,Art=75)
print(final_result.items())

Out: dict_items([('Math', 80), ('Chinese', 78), ('English', 96), ('Science', 60), ('Art', 75)])
字典排序: 根据键值Key排序

还是使用上面已经建好的字典 final_result,我们先根据字典中的键值来排序:

print(sorted(final_result.items())) # 自动根据键的值从小到大或者按照A-Z排序
Out:[('Art', 75), ('Chinese', 78), ('English', 96), ('Math', 80), ('Science', 60)]

换一种方式:

import operator
print(sorted(final_result.items(),key=operator.itemgetter(0)))
Out:[('Art', 75), ('Chinese', 78), ('English', 96), ('Math', 80), ('Science', 60)]

或者用lamba函数秀一波:

print(sorted(final_result.items(),key=lambda x:x[0]))
Out:[('Art', 75), ('Chinese', 78), ('English', 96), ('Math', 80), ('Science', 60)]

不要问我为什么,我也在学,但是我深知在Python编程装逼界你不用几个lamba,reduce什么的都不好意思和人打招呼,哈哈

如果我们想要实现根据键值倒序也很简单:

print(sorted(final_result.items(),reverse=True))
Out:[('Science', 60), ('Math', 80), ('English', 96), ('Chinese', 78), ('Art', 75)]
字典排序: 根据Value值排序

其实大家看到了根据key的排序,也猜到了如何根据value 排序:

print(sorted(final_result.items(),key=lambda x:x[1])) #根据分数排序,从低到高
Out:[('Science', 60), ('Art', 75), ('Chinese', 78), ('Math', 80), ('English', 96)]

或者换一种方式:

import operator
print(sorted(final_result.items(),key=operator.itemgetter(1)))

Out:[('Science', 60), ('Art', 75), ('Chinese', 78), ('Math', 80), ('English', 96)]

倒序也是类似:

print(sorted(final_result.items(),key=lambda kv:kv[1],reverse=True))
Out:[('English', 96), ('Math', 80), ('Chinese', 78), ('Art', 75), ('Science', 60)]

这里我在lamba后面没有写x,写了一个kv,就是告诉大家这里是什么不太重要,先这么理解就行

获取字典的子集

我们将会一直使用上面的final_result字典来示范,这里如果我们想要得到这个学生成绩大于70分的字典子集应该怎么做呢,很简单:

final_result= dict(Math=80,Chinese=78,English=96,Science=60,Art=75)
above_seventy ={subject:mark for subject,mark in final_result.items() if mark >70}
print(above_seventy.items())

Out:dict_items([('Math', 80), ('Chinese', 78), ('English', 96), ('Art', 75)])

交换字典中的key和value的值

这个小技巧可以这样实现:

exchange_key_value= dict(zip(final_result.values(),final_result.keys()))
print(exchange_key_value.items())

Out: dict_items([(80, 'Math'), (78, 'Chinese'), (96, 'English'), (60, 'Science'), (75, 'Art')])

获取字典最大值最小值

简直不要太简单呀:

print("The best mark is {}".format(max(final_result.values())))
print("The worst mark is {}".format(min(final_result.values())))

Out: The best mark is 96
     The worst mark is 60

总结

没啥可说的啦,写了这么多,求老铁们双击666鼓励一波!!!!
完结,撒花~


alpha94511
549 声望996 粉丝

Python爱好者, 前端开发厌恶者