Python 中的字典推导式(二)

一、字典推导式:

    字典推导式和列表推导式类似,也是通过循环和条件判断表达式配合使用,不同的是字典推导式返回值是一个字典,所以整个表达式需要写在{}内部。


二、语法:

1、语法一:

new_dictionary = {key_exp:value_exp for key, value in dict.items() if condition}


字典推导式说明:

    key:dict.items()字典中的key

    value:dict.items()字典中的value

    dict.items():序列

    condition:if条件表达式

    key_exp:在for循环中,如果if条件表达式condition成立(即条件表达式成立),返回对应的key,value当作key_exp,value_exp处理 

    value_exp:在for循环中,如果if条件表达式condition成立(即条件表达式成立),返回对应的key,value当作key_exp,value_exp处理

这样就返回一个新的字典。


2、语法二:

{key_exp:value_exp1 if condition else value_exp2 for key, value in dict.items()}

字典推导式说明:

    key:dict.items()字典中的key 

    value:dict.items()字典中的value 

    dict.items():序列 

    condition:if条件表达式的判断内容 

    value_exp1:在for循环中,如果条件表达式condition成立(即条件表达式成立),返回对应的key,value并作key_exp,value_exp1处理

    value_exp2:在for循环中,如果条件表达式condition不成立(即条件表达式不成立),返回对应的key,value并作key_exp,value_exp2处理

三、字典推导式实战:

1、在字典中提取或者修改数据,返回新的字典:

dictionary_1 = {'a': '1234', 'B': 'FFFF', 'c': ' 23432', 'D': '124fgr', 'e': 'eeeee', 'F': 'QQQQQ'}


# 案例一:获取字典中key值是小写字母的键值对
new_dict_1 = {key: value for key, value in dictionary_1.items() if key.islower()} 
new_dict_2 = {g: h for g, h in dictionary_1.items() if g.islower()} 
# g, h只是一个变量,使用任意字母都行,但是一定要前后保持一致。
print(new_dict_1)
print(new_dict_2)


# 案例二:将字典中的所有key设置为小写
new_dict_3 = {key.lower(): value for key, value in dictionary_1.items()}
# 将字典中的所有key设置为小写,value值设置为大写
new_dict_4 = {key.lower(): value.upper() for key, value in dictionary_1.items()}
print(new_dict_3)
print(new_dict_4)

# 案例三:将字典中所有key是小写字母的value统一赋值为'error'
new_dict_5 = {key: value if not key.islower() else 'error' for key, value in dictionary_1.items()} # if条件表达式用到了“非”的逻辑
# value if not key.islower() else 'error' 这一段的代码的含义是:
# 如果not key.islouer()--key值不是小写的,那么返回if前面的value值,否则就返回else后面的值。
print(new_dict_5)
执行结果如下图:
"""
{'a': '1234', 'c': ' 23432', 'e': 'eeeee'}
{'a': '1234', 'c': ' 23432', 'e': 'eeeee'}
{'a': '1234', 'b': 'FFFF', 'c': ' 23432', 'd': '124fgr', 'e': 'eeeee', 'f': 'QQQQQ'}
{'a': '1234', 'b': 'FFFF', 'c': ' 23432', 'd': '124FGR', 'e': 'EEEEE', 'f': 'QQQQQ'}
{'a': 'error', 'B': 'FFFF', 'c': 'error', 'D': '124fgr', 'e': 'error', 'F': 'QQQQQ'}
"""


2、在字符串中提取数据,返回新的字典:

# 在爬虫中,我们需要获取cookies并以字典的形式传参,如果cookies是字符串则需要转换为字典,经典代码案例如下:

# 原来的cookies很长,这里截取一部分做演示:

cookies = "anonymid=jy0ui55o-u6f6zd; depovince=GW; _r01_=1; JSESSIONID=abcMktGLRGjLtdhBk7OVw; ick_login=a9b557b8-8138-4e9d-8601-de7b2a633f80"


# 字典推导式,将长的字符串转化为字典。
new_dict_1 = {cookie.split("=")[0]: cookie.split("=")[1] for cookie in cookies.split(";")} 
print(new_dict_1)
"""
代码分析:
在字符串cookies中’=’前面是key,’=’后面是value,每一个’;’构成一个键值对;多个键值对构成一个字典;
1.根据’;’将字符串拆分为列表;
2.根据第一步获取的列表,遍历时将每一个字符串根据’=’再次拆分;
3.根据第二步拆分的结果,列表第一个元素作为key,列表第二个元素作为value;
"""


new_dict_2 = {key: value for t in cookies.split(";") for key, value in (t.split("="),)}


# 先将字符串通过';'分解成短的带有等号的字符串,然后将这个短的字符串转化为元组,最后再通过'='分解成俩个值分别赋给key、value。

print(new_dict_2)
"""
# 下面是分解的演示:
for t in cookies.split(';'):
    print(type(t))
    print((t.split('='),))
    print(type((t.split('='),)))
print(cookies.split(';'))
"""


执行结果如下图:


"""
{'anonymid': 'jy0ui55o-u6f6zd', ' depovince': 'GW', ' _r01_': '1', ' JSESSIONID': 'abcMktGLRGjLtdhBk7OVw', ' ick_login': 'a9b557b8-8138-4e9d-8601-de7b2a633f80'}
{'anonymid': 'jy0ui55o-u6f6zd', ' depovince': 'GW', ' _r01_': '1', ' JSESSIONID': 'abcMktGLRGjLtdhBk7OVw', ' ick_login': 'a9b557b8-8138-4e9d-8601-de7b2a633f80'}
"""


3、将字符串 "k:1|k1:2|k2:3|k3:4",处理成字典 {k:1,k1:2,...}:

str = "k:1|k1:2|k2:3|k3:4"
new_dict_1 = {key: value for t in str.split('|') for key, value in (t.split(':'),)}
print(new_dict_1)
 
new_dict_2 = {str_part.split(":")[0]: str_part.split(":")[1] for str_part in str.split('|')}
print(new_dict_2)


# 可以用for循环将字符串转化成字典
new_dict_3 ={}
for i in str.split('|'):
    # new_dict_3[i.split(":")[0]] = i.split(":")[1]
    key, value = i.split(':')
    new_dict_3[key] = value
print(new_dict_3)


执行结果如下图:


"""
{'k': '1', 'k1': '2', 'k2': '3', 'k3': '4'}
{'k': '1', 'k1': '2', 'k2': '3', 'k3': '4'}
{'k': '1', 'k1': '2', 'k2': '3', 'k3': '4'}
"""


4、生成一个包含5个随机数的字典:

# 生成一个包含5个随机数的字典
import random
new_dict_1 = {key:random.randint(10, 100) for key in range(1,6)}
print(new_dict_1)

执行结果如下图:

"""
{1: 65, 2: 60, 3: 54, 4: 29, 5: 53}
"""

5、将两个长度相同的列表合并成字典:

# 将两个长度相同的列表合并成字典
name = ['zhangsan', 'lisi', 'wangwu', 'maliu']
sign = ['双鱼座', '天蝎座', '水瓶座', '巨蟹座']
new_dict_2 = {name: value for name, value in zip(name, sign)}
print(new_dict_2)
print(type(zip(name,sign)))

执行结果如下图;

"""
{'zhangsan': '双鱼座', 'lisi': '天蝎座', 'wangwu': '水瓶座', 'maliu': '巨蟹座'}
<class 'zip'>
"""

6、将key中大小写相同的字母的value值求和:

# 将key中大小写相同的字母的value值求和
dict_a = {'a': 2, 'B': 5, 'A': 7, 'C': 10}
new_dict_1 = {key.lower(): dict_a.get(key.lower(), 0) + dict_a.get(key.upper(), 0) for key in dict_a.keys() if key.lower() in ['a', 'b']}
print(new_dict_1)

执行结果如下图:

"""
{'a': 9, 'b': 5}
"""

7、将字典中key、value互换位置:

# 将字典中key、value互换位置
d = {1: 'a', 2: 'b', 3: 'c'}
dd = {key: value for value, key in d.items()}
print(d)
print(dd)

执行结果如下图:

"""
{1: 'a', 2: 'b', 3: 'c'}
{'a': 1, 'b': 2, 'c': 3}
"""

总结:全是字典推导式的实例,一定可以理解字典推导式。

打赏

本篇文章链接 地址:https://wmzos.com/?id=93

相关阅读

添加新评论