Skip to content

列表推导式示例

列表推导式 Python 中存在一种特殊的表达式,名为推导式,它的作用是将一种数据结构作为输入,再经过过滤计算等处理,最后输出另一种数据结构。

Python 中存在一种特殊的表达式,名为推导式,它的作用是将一种数据结构作为输入,再经过过滤计算等处理,最后输出另一种数据结构。根据数据结构的不同会被分为列表推导式、集合推导式和字典推导式。我们先着重来介绍最常使用的列表推导式。

我们先看一下列表推导式的语法格式:

listname = [expression for variable in 对象(if condition)]
  • listname:新生成的列表名字。

  • expression:表达式。

  • variable:变量名。

  • (if condition):用于从对象中选择符合要求的列表。

我们分别从规定范围的数值列表、规定条件的列表和符合条件元素组成的列表三个方面讲起。

1. 规定范围的数值列表

我们先思考一下当我们需要生成 10 个数字并存放列表当中,我们先看一下普通方式:

listname = []
for i in range(10):
   listname.append(i)
print(listname)

输出结果为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

而使用列表推导式只需要一行就可以:

listname = [i for i in range(10)]

输出结果为:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

这种方式能简化我们在定义列表时的操作。

2. 根据规定条件生成列表

假定我们已知一个列表为 listname = [1,3,5,6,7,9,10,23,26,28,64,98],我们要找到其把里面的数全部加 5,普通方法:

listname = [1,3,5,6,7,9,10,23,26,28,64,98]
for i in range(len(listname)):
      listname[i] += 5
print(listname)

输出结果为:

[6, 8, 10, 11, 12, 14, 15, 28, 31, 33, 69, 103]

而使用列表推导式同样很简洁:

listname = [1,3,5,6,7,9,10,23,26,28,64,98]
listname = [ i + 5 for i in listname]

输出:

[6, 8, 10, 11, 12, 14, 15, 28, 31, 33, 69, 103]

3. 符合条件的元素组成的列表

这种类型的列表推导式要比前两种复杂点,但是能简化更多的代码。

我们先举个列子来看一下代码格式:

已知一个列表为 listname = [8,33,53,64,73,95,101,123,126,164,198],然后我们要找到列表中小于大于 100 的数字,然后乘上 0.8,最后返回到列表中。

如果我们使用普通方法:

python
listname = [10,20,30,40,60,120,130,140,160,180,200]
newlist = [] # 创建新列表来存储
for i in range(len(listname)):#索引值遍历
    if listname[i] > 100:#找到大于100的数
        listname[i] *= 0.8#乘上0.8
        newlist.append(listname[i])#添加到新列表中
print(newlist)

输出结果为:

[96.0, 104.0, 112.0, 128.0, 144.0, 160.0]

使用列表推导式:

listname = [10,20,30,40,60,120,130,140,160,180,200]
newlist = [i*0.8 for i in listname if i > 100]
print(newlist)

输出结果:

[96.0, 104.0, 112.0, 128.0, 144.0, 160.0]

我们来根据这个例子的语法结构来分析一下:

在使用复杂的列表推导式的时候我们可以采用这种方式,可以理解为我们先把符合条件的元素(条件语句)从对象中挑选出来,然后再经过输出表达式的处理,最后存放到了列表当中,形成新的列表。

总结与扩展

一、列表推导式,输出也是列表

1、格式一:[表达式 for 变量 in 旧列表]

python
list = [[1,2,3],[4,5,6],[7,8,9],[1,3,5]]
newlist = [i[-1] for i in list]
print(newlist)

//--> [3,6,9,5]

2、格式二: [表达式 for 变量 in 旧列表 if 条件]

python
#过滤掉长度小千或者等于3的人名
names = ['jack''tony','sufel','张三','李四','小明','ds','fd']
result = [name for name in names if len(name) > 3]
print(result)


#将符合条件的首字母大写capitalize()
result = [name .capitalize() for name in names if len(name) > 3]
print(result)


// ---> ['jack','tony', 'sufei']
// ---> ['Jack', 'Tony', 'Sunfei']
python
#将1-100之间能够被3整除的,组成一个新的列表
list = [i for i in range(1,101) if i % 3 == 0 and i % 5 == 0]
print(list)

// ---> [15,30,45,60, 75, 90]

3、格式三:[结果 A if 条件 else 结果 B for 变量 in 旧列表]

python
list3 = [1,2,4,32,56,43,42,12,34]
new_list3 = [i // 2 if i > 20 else i * 2 for i in list3]
print(new_list3)

// ---> [2, 4, 8, 16, 28, 21, 21, 24, 17]

4、for 循环的嵌套

#函数实现:[(偶数,奇数), (), ()]11之间的偶数和奇数构成元组列表

def func():
	  list  = []
	  for i in range(5):
	  	if i %2 == 0:
			for j in range(10):
				if j %2 != 0:
					list.append((i,j))
		print(list)
func()
#[(偶数,奇数), (), ()]1-10之间的偶数和奇数构成元组列表,for最套
list = [(i,j) for i in range(5) if i % 2 ==0 for j in range(10) if j % 2 != 0]
print(list)

输出结果:

	[3,6,9,5]

二、集合推导式

格式:{表达式 for 变量 in 列表}

类似于列表推导式,在列表推导式的基础上添加了一个去重的功能

# 集合推导式,{}类似于列表推导式,在列表推导式的基础上添加了一个去重的功能
tist1 = [1, 2, 4, 6, 2, 3, 46, 5, 23, 7, 8, 5, 4, 9, 6, 5, 7, 8, 9, 6]
set = {x - 1 for x in list1 if x > 5}
print(set)

// ---> [5, 6, 7, 8, 46, 22]

三、字典推导式

格式:{key,value for k,v in dict.items()}

// 字典推导式
dict6 = {'a': 'A', 'b': 'B', 'c': 'C', 'd': 'C'}
newdict6 = {value:key for key,value in dict6.items()}
print(newdict6)

// ---> {'A': 'a', 'B': 'b', 'C': 'd'}
dict1 = {'name': 'Tom', 'salary':3500}
dict2 = {'name': 'luck', 'salary':5000}
dict3 = {'name': 'jack', 'salary':4000}
dict4 = {'name': 'lily', 'salary':8000}
list2 = [dict1, dict2, dict3, dict4]

#如果信息大于5000,薪资加200,如果低于5000, 薪资加500
new_list2 = [A['salary'] + 500 if A['salary'] > 5000 else A['salary'] +200 for A in list2]
print(new_list2)

// ---> [3700, 5200, 4200, 8500]

参考文章: https://www.dotcpp.com/course/243https://blog.csdn.net/lyouhuan/article/details/125001553