sorted python dict_python:dict 真的很神奇

上篇的文章中,我们介绍了关于 python列表推导式的使用,字典推导式使用方法其实也类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要写在{}内部。不多说了直接上代码:

old_dict = {"a": 1, "B": 2, "c": 3, "D": 4}

new_dict = {key:value for key,value in old_dict.items() if key.islower()} >>>{"a": 1, "c": 3}

下面举个例子来演示字典推导式常用的场景,在我们日常爬虫工作中经常会遇到我们需要获取cookies并以字典的形式传参,如果cookies则需要转换为字典,经典代码案例如下:

cookies = "login_flag=y; url=www.baidu.com; loginfrom=nil"

cookies = {cookie.split("=")[0]:cookie.split("=")[1] for cookie in cookies.split("; ")}

print(cookies) >>>{"login_flag": "y", "url": "http://www.baidu.com", "loginfrom": "nil"}

还是那句字典推导式和列表推导式的效率均比普通的for循环效率更高,说到列表不得不在这里补充一个小知识点,那就是怎样用列表快速生成字典,大家继续往下看:

list_1 = ["a", "b", "c", "d"]

list_2 = [1, 2, 3, 4]

new_dict = dict(zip(list_1, list_2)) print(new_dict)

>>>{"a": 1, "b": 2, "c": 3, "d": 4}

对zip()方法不熟悉的小伙伴们可自行脑补,还是那句话基础的语法大家可以去网上搜索相关资料,这里我就记录一些大家不熟悉或者还不是很熟悉的知识点,希望能够帮助大家得到进一步的提升。下面我再为大家带来几个字典常用的“骚”操作:

①字典映射代替switch case语句

熟悉c#语言或者任意一门其他语言的小伙伴们是不是对switch case语句都很熟悉啊,但是我们的python语法里却没有这种语法,不过小伙伴们不要失望,我们的python编码还是很强大的,这都不是事儿!我将用python的字典来代替。

def get_sunday():return 'Sunday'

def get_monday():return 'Monday'

def get_tuesday():return 'Tuesday'

def get_default():return 'Unknown'

switch = {0: get_sunday, 1: get_monday, 2: get_tuesday}

weekname = switch.get(0, get_default)()

print(weekname) >>>Sunday

是不是很神奇,那么这里我问一下大家,假如传入一个字典中不存在的key,例如:switch.get(3, get_default)()会得到什么结果呢,程序报错?还是Unknown呢?如果回答错误的小伙伴可要回去把字典再好好温故一下咯。

②利用sorted快速将字典转成只包含keys的排序列表

old_dict = {"b": 1, "a": 2, "d": 3, "c": 4}

print(sorted(old_dict))

>>>["a", "b", "c", "d"]

既然这里提到了sorted()方法,那我就顺便讲一下sorted()对字典进行自定义排序的方法,这个很有实用意义:

old_dict = {"b": 1, "a": 2, "d": 3, "c": 4}

print(dict(sorted(old_dict.items(), key=lambda x: x[0])))

>>>{'a': 2, 'b': 1, 'c': 4, 'd': 3}

上面我用了lambda匿名函数根据items[0](也就是字典的key)来进行排序得到排序后的字典,对匿名函数还不熟悉的小伙伴不要急,后面文章会讲到的。当然如果现在还不熟悉lambda函数的也照样可以实现字典的排序,下面这段代码是等价的:

from operator import itemgetter old_dict = {"b": 1, "a": 2, "d": 3, "c": 4}

print(dict(sorted(old_dict.items(), key=itemgetter(0))))

>>>{'a': 2, 'b': 1, 'c': 4, 'd': 3}

③合并字典

dict_1 = {"b": 1}

dict_2 = {"a": 2}

print(dict(dict_1.items() | dict_2.items()))

print(dict(dict_1, **dict_2)) >>>{"b": 1, "a": 2}>>>{"b": 1, "a": 2}

上面的两种方法都得到了同样的结果,个人还是比较喜欢第一种方法,因为它的可读性要强些。当然实现字典合并不只是这几种方法,我在这里只是希望给小伙伴们扩展视野,让你看到一个百花齐放python,最后希望小伙伴们能够思考一个问题,当合并的两个字典中存在相同key的时候,合并后的结果会是怎样的呢?


版权声明:本文为weixin_42528090原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。