Python之列表推导式最全汇总(上篇)

目录
  • 前言
  • 列表推导式
  • 语法规范:
  • 入门实例
    • 生成过程
      • 方法一:
      • 方法二:
    • 列表元素间的运算
  • 附录

前言

网传的七天学Python的路线如下,我觉得可以在学过此表中前几天的内容后,就可以回头来学习一下

列表推导式:它综合了列表、for循环和条件语句。

第一天:基本概念(4小时) : print,变量,输入,条件语句。

第二天:基本概念(5小时) :列表,for循环,while循环,函数,导入模块。

第三天:简单编程问题(5小时) :交换两个变量值,将摄氏度转换为华氏温度,求数字中各位数之和, 判断某数是否为素数, 生成随机数,删除列表中的重复项等等。

第四天:中级编程问题(6小时) :反转-个字符串(回文检测),计算最大公约数,合并两个有序数组,猜数字游戏,计算年龄等等。

第五天:数据结构(6小时) :栈,队列,字典,元组,树,链表。

第六天:面向对象编程(OOP) (6小时) :对象,类,方法和构造函数,面向对象编程之继承。

第七天:算法(6小时) :搜索(线性和二分查找)、 排序(冒泡排序、 选择排序)、递归函数(阶乘、斐波那契数列)时间复杂度(线性、二次和常量)。

列表推导式

  • list comprehension或译为列表解析式,是一种创建列表的简洁语法;
  • 也可认为它是一个简版的for循环,但执行效率高于for循环。
  • python 2.7+ 开始又引入了集合推导式、字典推导式,原理与列表推导式相近。

语法规范:

out_list = [out_express for out_express in input_list if out_express_condition]

其中,

  • if 条件可有可无;
  • for 循环可以嵌套多层,内外层循环的变量不可以同名;
  • 推导式中也可以嵌套推导式,内外层推导式的变量互不影响,可以同名;
  • 推导表达式out_express尽可能用内置函数,省得import或def function()。

入门实例

>>> [i for i in range(20)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> [i for i in range(40) if i%2==0]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38]
>>> [i*2 for i in range(20)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38]
>>> [i+j for i in range(5) for j in range(5)]
[0, 1, 2, 3, 4, 1, 2, 3, 4, 5, 2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]
>>> [i+j for i in range(10) for j in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 2, 3, 4, 5, 6,
 7, 8, 9, 10, 11, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 4, 5, 6, 7, 8, 9, 10, 11,
 12, 13, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 6, 7, 8, 9, 10, 11, 12, 13, 14,
 15, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 8, 9, 10, 11, 12, 13, 14, 15, 16,
 17, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
>>> {i+j for i in range(10) for j in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18}
>>> [(i,j,k) for i in 'abc' for j in range(2) for k in range(2)]
[('a', 0, 0), ('a', 0, 1), ('a', 1, 0), ('a', 1, 1), ('b', 0, 0), ('b', 0, 1),
 ('b', 1, 0), ('b', 1, 1), ('c', 0, 0), ('c', 0, 1), ('c', 1, 0), ('c', 1, 1)]
>>> [chr(i) for i in range(97,123)]
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
>>> {i:ord(i) for i in [chr(i) for i in range(97,123)]}
{'a': 97, 'b': 98, 'c': 99, 'd': 100, 'e': 101, 'f': 102, 'g': 103, 'h': 104,
 'i': 105, 'j': 106, 'k': 107, 'l': 108, 'm': 109, 'n': 110, 'o': 111, 'p': 112,
 'q': 113, 'r': 114, 's': 115, 't': 116, 'u': 117, 'v': 118, 'w': 119, 'x': 120,
 'y': 121, 'z': 122}
>>> dic={i:ord(i) for i in [chr(i) for i in range(97,123)]}
>>> dic['x']
120
>>> 

注:

  • 列表推导式外用‘[...]’,换成‘{...}’就是集合推导式;有键值对就是字典推导式。
  • 推导式外用‘(...)’会得到一个“生成器”,如果需要“元组推导式”另要用tuple()函数转换;
  • 生成器还有一个特性,只能被遍历一次,遍历过后就会被清空。
>>> (i for i in range(20))
<generator object <genexpr> at 0x0000000002CF3890>
>>> type(i for i in range(20))
<class 'generator'>
>>> tuple(i for i in range(20))
(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
>>>
>>> g = (i for i in range(10))
>>> g
<generator object <genexpr> at 0x03CE71E8>
>>> a = [i for i in g]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> b = [i for i in g]
>>> b
[]
>>>

生成过程

>>> [i for i in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
#这个推导式用for循环赋值的代码:

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

注:

  • 当然这么简单的列表,可以不用推导式更不需要写代码来生成。
  • python有更加省事的方法来直接赋值:

方法一:

>>> a = []; a[:] = range(10)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>

方法二

此方法是我在学习用星号“*”给序列解包时偶尔试出来的

>>> *a,=range(10)  # 此处变量a后的逗号“,”必不可少
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> # 或者:
>>> a = [*range(10)]
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> # 若要取部分,把不要的元素“赋值”给下划线 _
>>> _,*a=range(10)
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
>>> # 元组的赋值,结尾用逗号:
>>> tp = *range(1,11),
>>> tp
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>>

序列解包 * :

>>> Cards = [*range(2,10),*list('TJQKA')]
>>> Cards
[2, 3, 4, 5, 6, 7, 8, 9, 'T', 'J', 'Q', 'K', 'A']
>>> Cards = *range(2,10),*tuple('TJQKA')
>>> Cards
(2, 3, 4, 5, 6, 7, 8, 9, 'T', 'J', 'Q', 'K', 'A')
>>>  # tuple 赋值时连最外的()都可以省掉

map()函数解包 *

>>> n = 12345678
>>> [int(i) for i in str(n)]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> [*map(int,str(n))]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> 

还有一个特别的:单循环的变量可用 _ 代替:

>>> [_ for _ in range(10)]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [_*_ for _ in range(10)]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> [str(_) for _ in range(2,10)]
['2', '3', '4', '5', '6', '7', '8', '9']
>>> 

列表元素间的运算

# 加法
>>> listAdd = lambda a,b:[i+j for m,i in enumerate(a) for n,j in enumerate(b) if m==n]
>>> a = [1,2,3,4]
>>> b = [2,4,7,11,16]
>>> listAdd(a,b)
[3, 6, 10, 15]
>>> listAdd([0]+a,b)
[2, 5, 9, 14, 20]
>>> listAdd(a,b[1:])
[5, 9, 14, 20]
>>> listAdd(a[1:],b)
[4, 7, 11]
>>> 
# 其它运算
>>> listOP = lambda a,b,c=0:[i-j if c==2 else i*j if c==3 else i/j if c==4 else i//j if c==5 else i%j if c==6 else i+j for m,i in enumerate(a) for n,j in enumerate(b) if m==n]
>>> a = [1,2,3,4]
>>> b = [2,4,7,11,16]
>>> listOP(a,b)
[3, 6, 10, 15]
>>> listOP(a,b,1)
[3, 6, 10, 15]
>>> listOP(a,b,2)
[-1, -2, -4, -7]
>>> listOP(b,a,2)
[1, 2, 4, 7]
>>> listOP(a,b,2)
[-1, -2, -4, -7]
>>> listOP(a,b,3)
[2, 8, 21, 44]
>>> listOP(a,b,4)
[0.5, 0.5, 0.42857142857142855, 0.36363636363636365]
>>> listOP(b,a,4)
[2.0, 2.0, 2.3333333333333335, 2.75]
>>> listOP(a,b,5)
[0, 0, 0, 0]
>>> listOP(b,a,5)
[2, 2, 2, 2]
>>> listOP(b[1:],a,5)
[4, 3, 3, 4]
>>> listOP(a,b,6)
[1, 2, 3, 4]
>>> listOP(b,a,6)
[0, 0, 1, 3]
>>> listOP(b[2:],a,6)
[0, 1, 1]
>>> 

附录

到此这篇关于Python之列表推导式最全汇总(上篇)的文章就介绍到这了,其他两个部分的内容(中、下篇)请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python小知识之几种推导式用法示例

    目录 前言 1.列表推导式 2.字典推导式 3.集合推导式 4.元组推导式 最后 前言 Python 推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体. Python 支持各种数据结构的推导式: 列表(list)推导式 字典(dict)推导式 集合(set)推导式 元组(tuple)推导式 1.列表推导式 列表推导式格式为: [表达式 for 变量 in 列表] [out_exp_res for out_exp in input_list]或者 [表达式 for

  • Python 异步之推导式示例详解

    目录 引言 1. 什么是异步推导式 2. 推导式 3. 异步推导式 4. Await 推导式 引言 当我们想到“pythonic”时,理解,如列表和字典理解是 Python 的一个特性. 这是我们执行循环的一种方式,与许多其他语言不同. Asyncio 允许我们使用异步推导式. 我们可以通过“async for”表达式使用异步推导式来遍历异步生成器和异步迭代器. 1. 什么是异步推导式 异步推导式是经典推导式的异步版本.Asyncio 支持两种类型的异步推导式,它们是“async for”推导式

  • Python之列表推导式最全汇总(中篇)

    目录 前言 列表推导式 语法规范: 初阶实例 1000~2021中包含7的数字有多少 求所有在100到1000之间的水仙花数 通常的解法,条件表达式比较麻,如果是10位数呢 把数字转成字符串,然后遍历计算立方和 一维与二维列表间的互转 实现二维列表的转置 行列互换,首行变首列,尾行变尾列,如下所示: 求列表嵌套的最大深度 求斜边长小于100的勾股数组 实现随机字符串(可作随机密码) 一个四层嵌套的推导式:求k等差数 附录 前言 网传的七天学Python的路线如下,我觉得可以在学过此表中前几天的内

  • Python之列表推导式最全汇总(下篇)

    目录 前言 列表推导式 语法规范: 进阶实例 乘法口诀表 求100以内的质数(或称素数) 求出字符串的所有字串(可推广到所有可切片数据类型) 根据方程式画出字符图 EXCEL表格列号字串转整数 打印Gray格雷码序列 高阶实例 杨辉三角形 斐波那契数列 曼德勃罗集(Mandelbrot Set)分形 附录 前言 网传的七天学Python的路线如下,我觉得可以在学过此表中前几天的内容后,就可以回头来学习一下 列表推导式:它综合了列表.for循环和条件语句. 第一天:基本概念(4小时) : prin

  • Python列表推导式详解

    目录 Python列表推导式 一.range()函数 二.列表推导式 三.代码可读性 四.字典推导式 五.集合推导式 Python列表推导式 列表推导式是Python构建列表(list)的一种快捷方式,可以使用简洁的代码就创建出一个列表. 一.range()函数 python的range()函数可用来创建一个整数列表,一般用在 for 循环中. range()语法:range(start, stop[, step]) start: 计数从start开始,默认是从0开始(闭区间),如:range(

  • 什么是python的列表推导式

    乍一看到列表推导式你可能会感到疑惑.它们是一种创建和使用列表的简洁方式.理解列表推导式是有用的,因为你可能在其他人的代码里看到列表推导式.下面来了解下列表推导式吧. 数字列表的推导式 回顾之前学过的知识,我们可以创建一个包含前10个数字的列表,如下所示: squares = [] for number in range(1,11): new_square = number**2 squares.append(new_square) for square in squares: print(squ

  • python中列表推导式与生成器表达式对比详解

    目录 概述 列表推导式 生成器表达式 使用场景选择 参考 总结 概述 Python中的列表推倒式(List Comprehension) 和 生成器表达式(Generator Expression)是两种很相似的表达式,但含义却不大不同,这里做一个对比. 列表推导式 列表推导式是比较常用的技术,能将本来需要for loop 和 if else 语句的情况简化成一条指令,最终得到一个列表对象: even = [e for e in range(10) if e % 2 == 0] 具体细节不过多展

  • 简单了解python 生成器 列表推导式 生成器表达式

    生成器就是自己用python代码写的迭代器,生成器的本质就是迭代器. 通过以下两种方式构建一个生成器: 1.通过生成器函数 2.生成器表达式 生成器函数: 函数 def func1(x): x += 1 return x print(func1(5)) 生成器函数 def func1(x): x += 1 yield x g_obj = func1(5) print(g_obj.__next__()) 一个next对应一个yield. yield VS return return 结束函数,给函

  • python之列表推导式的用法

    1. 定义 用一行构建代码 例题 # 构建一个1-100的列表 l1 = [i for i in range(1,101)] print(l1) # 输出结果 [1,2,3,4,5,6,...100] 2. 两种构建方式 2.1 循环模式: [变量(加工后的变量) for 变量 in iterable] 例题 1. 将10以内所有整数写入列表 print([i for i in range(1,11)]) # 输出结果 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 2. 将10

  • Python的列表推导式你了解吗

    目录 语法 实例 总结 语法 1.普通 [expression for target in iterable] 2.带条件 [expression for target in iterable if condition] 3.嵌套 [expression for target1 in iterable1 if condition1 for target2 in iterable2 if condition2 ... for targetN in iterableN if conditionN]

  • Python列表推导式、字典推导式与集合推导式用法实例分析

    本文实例讲述了Python列表推导式.字典推导式与集合推导式用法.分享给大家供大家参考,具体如下: 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(list)推导式 字典(dict)推导式 集合(set)推导式 一.列表推导式 1.使用[]生成list 基本格式 variable = [out_exp_res for out_exp in input_

  • Python学习笔记之列表推导式实例分析

    本文实例讲述了Python学习笔记之列表推导式.分享给大家供大家参考,具体如下: 列表推导式 列表推导式可以快速简练地创建列表 之前的复杂写法: capitalized_cities = [] for city in cities: capitalized_cities.append(city.title()) 简化后的写法: capitalized_cities = [city.title() for city in cities] 由此可见:借助列表推导式,我们可以使用 for 循环用一步创

  • Python推导式简单示例【列表推导式、字典推导式与集合推导式】

    本文实例讲述了Python推导式.分享给大家供大家参考,具体如下: 1. 列表推导式 >>> li = [1,2,3,4,5,6] # 求元素的平方 >>> li_a = [x**2 for x in li ] >>> li_a [1, 4, 9, 16, 25, 36] # 提取偶数值 >>> li_b = [x for x in li if x%2==0] >>> li_b [2, 4, 6] # 将多维数组转换

随机推荐