列表——推导式
常规列表
# 快速生成一个列表( 0 到 99 )
list1 = []
for i in range(100):
list1.append("data{}".format(i))
print("list1的值为:", list1)
# 运行结果为:
list1的值为: ['data0', 'data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data8', 'data9', 'data10', 'data11', 'data12', 'data13', 'data14', 'data15', 'data16', 'data17', 'data18', 'data19', 'data20', 'data21', 'data22', 'data23', 'data24', 'data25', 'data26', 'data27', 'data28', 'data29', 'data30', 'data31', 'data32', 'data33', 'data34', 'data35', 'data36', 'data37', 'data38', 'data39', 'data40', 'data41', 'data42', 'data43', 'data44', 'data45', 'data46', 'data47', 'data48', 'data49', 'data50', 'data51', 'data52', 'data53', 'data54', 'data55', 'data56', 'data57', 'data58', 'data59', 'data60', 'data61', 'data62', 'data63', 'data64', 'data65', 'data66', 'data67', 'data68', 'data69', 'data70', 'data71', 'data72', 'data73', 'data74', 'data75', 'data76', 'data77', 'data78', 'data79', 'data80', 'data81', 'data82', 'data83', 'data84', 'data85', 'data86', 'data87', 'data88', 'data89', 'data90', 'data91', 'data92', 'data93', 'data94', 'data95', 'data96', 'data97', 'data98', 'data99']
=========================================================================================
列表推导式的使用
li2 = ["data{}".format(i) for i in range(100)]
print(li2)
# 运行结果为:
['data0', 'data1', 'data2', 'data3', 'data4', 'data5', 'data6', 'data7', 'data8', 'data9', 'data10', 'data11', 'data12', 'data13', 'data14', 'data15', 'data16', 'data17', 'data18', 'data19', 'data20', 'data21', 'data22', 'data23', 'data24', 'data25', 'data26', 'data27', 'data28', 'data29', 'data30', 'data31', 'data32', 'data33', 'data34', 'data35', 'data36', 'data37', 'data38', 'data39', 'data40', 'data41', 'data42', 'data43', 'data44', 'data45', 'data46', 'data47', 'data48', 'data49', 'data50', 'data51', 'data52', 'data53', 'data54', 'data55', 'data56', 'data57', 'data58', 'data59', 'data60', 'data61', 'data62', 'data63', 'data64', 'data65', 'data66', 'data67', 'data68', 'data69', 'data70', 'data71', 'data72', 'data73', 'data74', 'data75', 'data76', 'data77', 'data78', 'data79', 'data80', 'data81', 'data82', 'data83', 'data84', 'data85', 'data86', 'data87', 'data88', 'data89', 'data90', 'data91', 'data92', 'data93', 'data94', 'data95', 'data96', 'data97', 'data98', 'data99']
=========================================================================================
常规列表结合 if 进行过滤
list3 = []
for i in range(100):
if i % 2 == 0:
list3.append("data{}".format(i))
print("list3的值为:", list3)
# 运行结果为:
list3的值为: ['data0', 'data2', 'data4', 'data6', 'data8', 'data10', 'data12', 'data14', 'data16', 'data18', 'data20', 'data22', 'data24', 'data26', 'data28', 'data30', 'data32', 'data34', 'data36', 'data38', 'data40', 'data42', 'data44', 'data46', 'data48', 'data50', 'data52', 'data54', 'data56', 'data58', 'data60', 'data62', 'data64', 'data66', 'data68', 'data70', 'data72', 'data74', 'data76', 'data78', 'data80', 'data82', 'data84', 'data86', 'data88', 'data90', 'data92', 'data94', 'data96', 'data98']
=========================================================================================
推导式结合 if 对数据进行过滤
li3 = ["data{}".format(i) for i in range(100) if i ]
print(li3)
# 运行结果为:
['data0', 'data2', 'data4', 'data6', 'data8', 'data10', 'data12', 'data14', 'data16', 'data18', 'data20', 'data22', 'data24', 'data26', 'data28', 'data30', 'data32', 'data34', 'data36', 'data38', 'data40', 'data42', 'data44', 'data46', 'data48', 'data50', 'data52', 'data54', 'data56', 'data58', 'data60', 'data62', 'data64', 'data66', 'data68', 'data70', 'data72', 'data74', 'data76', 'data78', 'data80', 'data82', 'data84', 'data86', 'data88', 'data90', 'data92', 'data94', 'data96', 'data98']
=========================================================================================
生成一个[“data0”,“number1”,…“data98”,“number1”]的列表?
list4 = []
for i in range(100):
if i % 2 == 0:
list4.append("data{}".format(i))
else:
list4.append("number{}".format(i))
print("list4的值为:", list4)
# 运行结果为:
list4的值为: ['data0', 'number1', 'data2', 'number3', 'data4', 'number5', 'data6', 'number7', 'data8', 'number9', 'data10', 'number11', 'data12', 'number13', 'data14', 'number15', 'data16', 'number17', 'data18', 'number19', 'data20', 'number21', 'data22', 'number23', 'data24', 'number25', 'data26', 'number27', 'data28', 'number29', 'data30', 'number31', 'data32', 'number33', 'data34', 'number35', 'data36', 'number37', 'data38', 'number39', 'data40', 'number41', 'data42', 'number43', 'data44', 'number45', 'data46', 'number47', 'data48', 'number49', 'data50', 'number51', 'data52', 'number53', 'data54', 'number55', 'data56', 'number57', 'data58', 'number59', 'data60', 'number61', 'data62', 'number63', 'data64', 'number65', 'data66', 'number67', 'data68', 'number69', 'data70', 'number71', 'data72', 'number73', 'data74', 'number75', 'data76', 'number77', 'data78', 'number79', 'data80', 'number81', 'data82', 'number83', 'data84', 'number85', 'data86', 'number87', 'data88', 'number89', 'data90', 'number91', 'data92', 'number93', 'data94', 'number95', 'data96', 'number97', 'data98', 'number99']
=========================================================================================
推导式结合三目运算符(三元运算符)
li5 = ["data{}".format(i) if i % 2 == 0 else "number{}".format(i) for i in range(100)]
print(li5)
# 运行结果为:
['data0', 'number1', 'data2', 'number3', 'data4', 'number5', 'data6', 'number7', 'data8', 'number9', 'data10', 'number11', 'data12', 'number13', 'data14', 'number15', 'data16', 'number17', 'data18', 'number19', 'data20', 'number21', 'data22', 'number23', 'data24', 'number25', 'data26', 'number27', 'data28', 'number29', 'data30', 'number31', 'data32', 'number33', 'data34', 'number35', 'data36', 'number37', 'data38', 'number39', 'data40', 'number41', 'data42', 'number43', 'data44', 'number45', 'data46', 'number47', 'data48', 'number49', 'data50', 'number51', 'data52', 'number53', 'data54', 'number55', 'data56', 'number57', 'data58', 'number59', 'data60', 'number61', 'data62', 'number63', 'data64', 'number65', 'data66', 'number67', 'data68', 'number69', 'data70', 'number71', 'data72', 'number73', 'data74', 'number75', 'data76', 'number77', 'data78', 'number79', 'data80', 'number81', 'data82', 'number83', 'data84', 'number85', 'data86', 'number87', 'data88', 'number89', 'data90', 'number91', 'data92', 'number93', 'data94', 'number95', 'data96', 'number97', 'data98', 'number99']
=========================================================================================
多重for循环的推导式
# 举个例子:使用常规的双重for循环
li = []
for i in range(5):
for j in range(i + 1):
# li.append(f"{i}*{j}={i * j}")
print(f"{i}*{j}={i * j}", end=" ")
print()
# 运行结果为:
0*0=0
1*0=0 1*1=1
2*0=0 2*1=2 2*2=4
3*0=0 3*1=3 3*2=6 3*3=9
4*0=0 4*1=4 4*2=8 4*3=12 4*4=16
=========================================================================================
li = []
for i in range(5):
for j in range(i + 1):
li.append(f"{i}*{j}={i * j}")
print(li)
# 运行结果为:
['0*0=0', '1*0=0', '1*1=1', '2*0=0', '2*1=2', '2*2=4', '3*0=0', '3*1=3', '3*2=6', '3*3=9', '4*0=0', '4*1=4', '4*2=8', '4*3=12', '4*4=16']
=========================================================================================
- 多重for循环的推导式
li2 = [f"{i}*{j}={i * j}" for i in range(5) for j in range(i + 1)]
print(li2)
# 运行结果为:
['0*0=0', '1*0=0', '1*1=1', '2*0=0', '2*1=2', '2*2=4', '3*0=0', '3*1=3', '3*2=6', '3*3=9', '4*0=0', '4*1=4', '4*2=8', '4*3=12', '4*4=16']
=========================================================================================
字典推导式
传统for循环的做法
li = ["a", "b", "c", "d", "e", "f", "g"]
# # 传统for循环的做法
dict1 = {}
for i, j in enumerate(li):
dict1[i] = j
print(dict1)
# 运行结果为:
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g'}
=========================================================================================
字典推导式
li = ["a", "b", "c", "d", "e", "f", "g"]
# 字典推导式的语法
dic = {i: j for i, j in enumerate(li)}
print(dic)
# 运行结果为:
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f', 6: 'g'}
=========================================================================================
集合推导式
li = ["a", "b", "c", "d", "e", "f", "g"]
# 集合推导式
s1 = {j for i, j in enumerate(li)}
print(s1)
# 运行结果为:
{'g', 'b', 'f', 'e', 'c', 'a', 'd'}
=========================================================================================
使用字典推导式将下面字符串格式的数据,改成字典类型的数据
# 使用字典推导式将下面字符串格式的数据,改成字典类型的数据
cook_str = 'BIDUPSID=D0727533D7147B7;PSTM=1530348042; ' \
'BAIDUID=B1005C9BC2EB28; sugstore=0;' \
'__cfduid=d0a13458f8ac2a;BD_UPN=12314353;' \
'ispeed_lsm=2;BDORZ=B490B5EBF6F3CD402'
# 使用for循环实现
dic = {}
for item in cook_str.split(";"):
key = item.split("=")[0]
value = item.split("=")[1]
dic[key] = value
print(dic)
# 运行结果为:
{'BIDUPSID': 'D0727533D7147B7', 'PSTM': '1530348042', ' BAIDUID': 'B1005C9BC2EB28', ' sugstore': '0', '__cfduid': 'd0a13458f8ac2a', 'BD_UPN': '12314353', 'ispeed_lsm': '2', 'BDORZ': 'B490B5EBF6F3CD402'}
=========================================================================================
cook_str = 'BIDUPSID=D0727533D7147B7;PSTM=1530348042; ' \
'BAIDUID=B1005C9BC2EB28; sugstore=0;' \
'__cfduid=d0a13458f8ac2a;BD_UPN=12314353;' \
'ispeed_lsm=2;BDORZ=B490B5EBF6F3CD402'
# 推导式实现
dic2 = {item.split("=")[0]: item.split("=")[1] for item in cook_str.split(";")}
print(dic2)
# 运行结果为:
{'BIDUPSID': 'D0727533D7147B7', 'PSTM': '1530348042', ' BAIDUID': 'B1005C9BC2EB28', ' sugstore': '0', '__cfduid': 'd0a13458f8ac2a', 'BD_UPN': '12314353', 'ispeed_lsm': '2', 'BDORZ': 'B490B5EBF6F3CD402'}
=========================================================================================
使用双重for实现字典推导式
# 使用字典推导式将下面字符串格式的数据,改成字典类型的数据
cook_str = 'BIDUPSID=D0727533D7147B7;PSTM=1530348042; ' \
'BAIDUID=B1005C9BC2EB28; sugstore=0;' \
'__cfduid=d0a13458f8ac2a;BD_UPN=12314353;' \
'ispeed_lsm=2;BDORZ=B490B5EBF6F3CD402'
# 使用双重for实现字典推导式
dic2 = {i[0]: i[1] for item in cook_str.split(";") for i in [item.split("=")]}
print(dic2)
# 运行结果为:
{'BIDUPSID': 'D0727533D7147B7', 'PSTM': '1530348042', ' BAIDUID': 'B1005C9BC2EB28', ' sugstore': '0', '__cfduid': 'd0a13458f8ac2a', 'BD_UPN': '12314353', 'ispeed_lsm': '2', 'BDORZ': 'B490B5EBF6F3CD402'}
附上几道练习题
1、通过列表推导式完成下面数据类型转换
- 现在有以下数据,li1 = ["{‘a’:11,‘b’:2}","[11,22,33,44]"]
- 需要转换为以下格式: li1 = [{‘a’:11,‘b’:2},[11,22,33,44]]
2、 Names=[‘python’,‘java’,‘php’,‘c’,‘c++’,‘django’,‘unittest’,‘pytest’,‘pymysql’],
请通过列表推导式,获取names中字符串长度大于4的元素
3、通过字典推导式,颠倒字典的键名和值: 将{‘py’: “python09”, ‘java’: “java09”} 转换为:
{‘python09’: “py”, ‘java09’: “java”}
4、将字典{‘x’: ‘A’, ‘y’: ‘B’, ‘z’: ‘C’ } 通过推导式转换为:[‘x=A’,‘y=B’,‘z=C’]
"""
1、通过列表推导式完成下面数据类型转换
现在有以下数据, li1 = ["{'a':11,'b':2}","[11,22,33,44]"]
需要转换为以下格式: li1 = [{'a':11,'b':2},[11,22,33,44]]
"""
li1 = ["{'a':11,'b':2}", "[11,22,33,44]"]
res1 = [eval(i) for i in li1]
print("第一题:", res1)
"""
2、 Names=['python','java','php','c','c++','django','unittest','pytest','pymysql'],
请通过列表推导式,获取names中字符串长度大于4的元素
"""
Names = ['python', 'java', 'php', 'c', 'c++', 'django', 'unittest', 'pytest', 'pymysql']
res2 = [i for i in Names if len(i) > 4]
print("第二题:", res2)
"""
3、通过字典推导式,颠倒字典的键名和值:
将{'py': "python09", 'java': "java09"} 转换为: {'python09': "py", 'java09': "java"}
"""
dict3 = {'py': "python09", 'java': "java09"}
res3 = {v: k for k, v in dict3.items()}
print("第三题:", res3)
"""
4、将字典{'x': 'A', 'y': 'B', 'z': 'C' } 通过推导式转换为:['x=A','y=B','z=C']
"""
dict4 = {'x': 'A', 'y': 'B', 'z': 'C'}
res4 = [f"{k}={v}" for k, v in dict3.items()]
print("第四题:", res4)