Python-列表推导式、集合推导式、字典推导式

Python-列表推导式、集合推导式、字典推导式

推导式comprehensions(又称解析式),是Python的一种独有特性。推导式是可以从一个数据序列构建另一个新的数据序列的结构体。共有三种推导式,在Python2和3中都有支持:

  • 列表(list)推导式
  • 字典(dict)推导式
  • 集合(set)推导式

1、列表推导式

1.1、基本格式

[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

例1: 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

  • 常规写法
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
result = []
for name in names:
	if len(name)>3:
		result.append(name.upper())
print(result)
  • 列表推导式写法(仅添加判断语句
names = ['Bob','Tom','alice','Jerry','Wendy','Smith']
result = [name.upper() for name in names if len(name)>3]

print(result)

输出结果:

['ALICE', 'JERRY', 'WENDY', 'SMITH']

例2:生成间隔5分钟的时间列表序列:

  • 常规写法
result = []
for h in range(0,24):
	for m in range(0,60,5):
		result.append("%02d:%02d" %(h,m))

print(result)
  • 列表推导式写法(两层循环语句)
list1 = ["%02d:%02d" %(h,m) for h in range(0, 24) for m in range(0, 60, 5)]
print(list1)

输出结果:

['00:00', '00:05', '00:10', '00:15', '00:20', '00:25', '00:30', '00:35', '00:40', '00:45', '00:50', '00:55', '01:00', '01:05', '01:10', '01:15', '01:20', '01:25', '01:30', '01:35', '01:40', '01:45', '01:50', '01:55', '02:00', '02:05', '02:10', '02:15', '02:20', '02:25', '02:30', '02:35', '02:40', '02:45', '02:50', '02:55', '03:00', '03:05', '03:10', '03:15', '03:20', '03:25', '03:30', '03:35', '03:40', '03:45', '03:50', '03:55', '04:00', '04:05', '04:10', '04:15', '04:20', '04:25', '04:30', '04:35', '04:40', '04:45', '04:50', '04:55', '05:00', '05:05', '05:10', '05:15', '05:20', '05:25', '05:30', '05:35', '05:40', '05:45', '05:50', '05:55', '06:00', '06:05', '06:10', '06:15', '06:20', '06:25', '06:30', '06:35', '06:40', '06:45', '06:50', '06:55', '07:00', '07:05', '07:10', '07:15', '07:20', '07:25', '07:30', '07:35', '07:40', '07:45', '07:50', '07:55', '08:00', '08:05', '08:10', '08:15', '08:20', '08:25', '08:30', '08:35', '08:40', '08:45', '08:50', '08:55', '09:00', '09:05', '09:10', '09:15', '09:20', '09:25', '09:30', '09:35', '09:40', '09:45', '09:50', '09:55', '10:00', '10:05', '10:10', '10:15', '10:20', '10:25', '10:30', '10:35', '10:40', '10:45', '10:50', '10:55', '11:00', '11:05', '11:10', '11:15', '11:20', '11:25', '11:30', '11:35', '11:40', '11:45', '11:50', '11:55', '12:00', '12:05', '12:10', '12:15', '12:20', '12:25', '12:30', '12:35', '12:40', '12:45', '12:50', '12:55', '13:00', '13:05', '13:10', '13:15', '13:20', '13:25', '13:30', '13:35', '13:40', '13:45', '13:50', '13:55', '14:00', '14:05', '14:10', '14:15', '14:20', '14:25', '14:30', '14:35', '14:40', '14:45', '14:50', '14:55', '15:00', '15:05', '15:10', '15:15', '15:20', '15:25', '15:30', '15:35', '15:40', '15:45', '15:50', '15:55', '16:00', '16:05', '16:10', '16:15', '16:20', '16:25', '16:30', '16:35', '16:40', '16:45', '16:50', '16:55', '17:00', '17:05', '17:10', '17:15', '17:20', '17:25', '17:30', '17:35', '17:40', '17:45', '17:50', '17:55', '18:00', '18:05', '18:10', '18:15', '18:20', '18:25', '18:30', '18:35', '18:40', '18:45', '18:50', '18:55', '19:00', '19:05', '19:10', '19:15', '19:20', '19:25', '19:30', '19:35', '19:40', '19:45', '19:50', '19:55', '20:00', '20:05', '20:10', '20:15', '20:20', '20:25', '20:30', '20:35', '20:40', '20:45', '20:50', '20:55', '21:00', '21:05', '21:10', '21:15', '21:20', '21:25', '21:30', '21:35', '21:40', '21:45', '21:50', '21:55', '22:00', '22:05', '22:10', '22:15', '22:20', '22:25', '22:30', '22:35', '22:40', '22:45', '22:50', '22:55', '23:00', '23:05', '23:10', '23:15', '23:20', '23:25', '23:30', '23:35', '23:40', '23:45', '23:50', '23:55']

例3: 从1到9的序列中,奇数+1操作,偶数+2操作 (使用三元表达式)

list1 = [x+2 if x%2 ==0 else x+1 for x in range(1,10,1)]
print(list1)

输出结果:

[2, 4, 4, 6, 6, 8, 8, 10, 10]

列表推导式总共有两种形式:

[x for x in data if condition]

此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表

[exp1 if condition else exp2 for x in data]

此处if…else主要起赋值作用,当data中的数据满足if条件时将其做exp1处理,否则按照exp2处理,最后统一生成为一个数据列表

1.2、使用()生成generator
将上述列表推导式的[]改成(),即可得到生成器

multiples = (i for i in range(30) if i%3 == 0)
print(type(multiples))

# <class 'generator'>

2.字典推导式

字典推导和列表推导的使用类似,只不过中括号改成大括号。

基本格式:

{ key_expr: value_expr for value in collection if condition }

举例说明:

  • 用字符串和其长度创建字典
strings = ['import','is','with','if','file','exception']
D = {key: val for val,key in enumerate(strings)}

输出结果:

{'exception': 5, 'file': 4, 'if': 3, 'import': 0, 'is': 1, 'with': 2}
  • 大小写key合并
mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}

mcase_frequency = {
    k.lower(): mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0)
    for k in mcase.keys()
    if k.lower() in ['a','b']
}

print(mcase_frequency)
#  Output: {'a': 17, 'b': 34}
  • 快速更换key和value
mcase = {'a': 10, 'b': 34}
mcase_frequency = {v: k for k, v in mcase.items()}
print(mcase_frequency)

#  Output: {10: 'a', 34: 'b'}

3. 集合推导式

集合推导式跟列表推导式也是类似的。 唯一的区别在于它使用大括号{ }。

基本格式:

{ expr for value in collection if condition }

举例说明:

  • 集合推导式
squared = {x**2 for x in [1, 1, 2]}
print(squared)

# Output: set([1, 4])
  • 用集合推导式,创建字符串长度的集合
strings = ['a','is','with','if','file','exception'] 

{len(s) for s in strings}  # 有长度相同的会只留一个,这在实际上也非常有用 

# {1, 2, 4, 9}
  • 一个由男人列表和女人列表组成的嵌套列表,取出姓名中带有两个以上含字母e的姓名,组成列表
names = [['Tom','Billy','Jefferson','Andrew','Wesley','Steven','Joe'], ['Alice','Jill','Ana','Wendy','Jennifer','Sherry','Eva']]
tmp = [] 

# 用for循环实现
for lst in names:
    for name in lst: 
        if name.count('e') >= 2: 
            tmp.append(name)

print(tmp) 

# 用嵌套列表实现
[name for lst in names for name in lst if name.count('e')>=2] # 注意遍历顺序,这是实现的关键 

# ['Jefferson', 'Wesley', 'Steven', 'Jennifer']

4. 参考文章

http://blog.51cto.com/6226001001/2059536
https://blog.csdn.net/yjk13703623757/article/details/79490476

发布了50 篇原创文章 · 获赞 4 · 访问量 1365

猜你喜欢

转载自blog.csdn.net/weixin_43999327/article/details/103714312