>>> [i*i for i in range(10)] [0,1, 4, 9, 16, 25, 36, 49, 64, 81]
它就相当于
1 2 3 4 5
>>> l = [] >>> for i in range(10): ... l.append(i*i) ... >>>
我们可以用列表推导快速初始化一个二维数组
1 2 3 4 5 6 7 8 9 10 11 12
m = [[0,0,0], [0,0,0], [0,0,0] ]
n = [] for row in range(3): r = [] for col in range(3): r.append(0) n.append(r) print(n)
用下面的式子就可以得到这个二维数组
1 2
>>> [[0]*3for i in range(3)] [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
列表推导式有很多种形式
for循环前面加if…else…
这种生成的元素个数不会少,只是根据for循环的结果使用不同的表达式
1 2 3 4 5 6 7
# 如果i是5的倍数,结果是i,否则就是0 >>> [i if i % 5 == 0else0for i in range(20)] [0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 10, 0, 0, 0, 0, 15, 0, 0, 0, 0]
# 如果是偶数就加100,奇数就减100 >>> [i+100if i % 2 == 0else i-100for i in range(10)] [100, -99, 102, -97, 104, -95, 106, -93, 108, -91]
for循环后面加if…
这种会只取符合条件的元素,所以元素个数跟条件相关
1 2 3 4 5 6 7 8 9
# for循环的结果只选择是偶数的 >>> [i for i in range(10) if i % 2 == 0] [0, 2, 4, 6, 8] # for循环的结果只选择是2和3的倍数的 >>> [i for i in range(10) if i % 2 == 0and i % 3 == 0] [0, 6] # for循环的结果只选择偶数,并且应用str函数 >>> [str(i) for i in range(10) if i % 2 == 0] ['0', '2', '4', '6', '8']
嵌套循环
假如我们展开一个二维矩阵,如下面的m,我们可以用嵌套循环实现。
1 2 3 4 5 6 7 8 9 10
m = [[1,2,3], [4,5,6], [7,8,9] ]
n = [] for row in range(3): for col in range(3): n.append(m[row][col]) print(n)
用列表推导,最外层的for循环得到的row,可以在内层中使用
1 2 3 4 5 6
m = [[1,2,3], [4,5,6], [7,8,9] ] n = [col for row in m for col in row] print(n)
再比如下面这个例子
1 2
>>> [a + b for a in'123'for b in'abc'] ['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']
更多用法
列表推导的用法比较灵活,我们不一定要把所有的都掌握,但是要能看懂。
1 2 3 4
>>> dic = {"k1":"v1","k2":"v2"} >>> a = [k+":"+v for k,v in dic.items()] >>> a ['k1:v1', 'k2:v2']
1.2 集合推导
集合推导的语法与列表推导一样,只是它是用”{}“,而且,集合会自动去重
1 2 3 4
>>> { i for i in range(10)} {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} >>> { 0if i % 2 == 0else1for i in range(10)} {0, 1}
1.3 字典推导
字典推导的语法也与其他的类似,只不过在最前面的格式是key:value,而且也是会去重
1 2 3 4
>>> { i : i.upper() for i in'hello world'} {'h': 'H', 'e': 'E', 'l': 'L', 'o': 'O', ' ': ' ', 'w': 'W', 'r': 'R', 'd': 'D'} >>> { str(i) : i*i for i in range(10)} {'0': 0, '1': 1, '2': 4, '3': 9, '4': 16, '5': 25, '6': 36, '7': 49, '8': 64, '9': 81}