【链式表达式●列表推导式学习笔记】

将字符和数字组合

time_list = [str(d) + "年" for d in range(1993,2019) ]
print("time_list =",time_list )```

结果:

time_list = ['1993年', '1994年', '1995年', '1996年', '1997年', '1998年', '1999年', '2000年', '2001年', '2002年', '2003年', '2004年', '2005年', '2006年', '2007年', '2008年', '2009年', '2010年', '2011年', '2012年', '2013年', '2014年', '2015年', '2016年', '2017年', '2018年']

将数据、字符串选择出来

POPULATION[1:]= [['China', 1420062022], ['India', 1368737513], ['United States', 329093110], ['Indonesia', 269536482],......]
data = [x for _, x in POPULATION[1:]]
print("data =",data )

结果:

data = [1420062022, 1368737513, 329093110, 269536482,......]

提取字符串

name_str = [y for y,_ in POPULATION[1:]]
print("name_str =",name_str )

结果:

name_str = ['China', 'India', 'United States', 'Indonesia',......]

其他

a_list = [x * x for x in range(10)]
print(a_list)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
b_list = [x * x for x in range(10) if x % 2 == 0]
print(b_list)
[0, 4, 16, 36, 64]

列表推导式可使用多个循环,就像嵌套循环一样。例如如下代码:

# d_list列表包含20个元素
d_list = [(x, y) for x in range(5) for y in range(4)]
print(d_list)
[(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 1), (1, 2), (1, 3), (2, 0), (2, 1), (2, 2), (2, 3), (3, 0), (3, 1), (3, 2), (3, 3), (4, 0), (4, 1), (4, 2), (4, 3)]
e_list = [[x, y, z] for x in range(5) for y in range(4) for z in range(6)]
# e_list列表包含120个元素
print(e_list)
[[0, 0, 0], [0, 0, 1], [0, 0, 2], [0, 0, 3], [0, 0, 4], [0, 0, 5], [0, 1, 0], [0, 1, 1], [0, 1, 2], [0, 1, 3], [0, 1, 4], [0, 1, 5], [0, 2, 0], [0, 2, 1], [0, 2, 2], [0, 2, 3], [0, 2, 4], [0, 2, 5], [0, 3, 0], [0, 3, 1], [0, 3, 2], [0, 3, 3], [0, 3, 4], [0, 3, 5], [1, 0, 0], [1, 0, 1], [1, 0, 2], [1, 0, 3], [1, 0, 4], [1, 0, 5], [1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 1, 4], [1, 1, 5], [1, 2, 0], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 2, 4], [1, 2, 5], [1, 3, 0], [1, 3, 1], [1, 3, 2], [1, 3, 3], [1, 3, 4], [1, 3, 5], [2, 0, 0], [2, 0, 1], [2, 0, 2], [2, 0, 3], [2, 0, 4], [2, 0, 5], [2, 1, 0], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 1, 4], [2, 1, 5], [2, 2, 0], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 2, 4], [2, 2, 5], [2, 3, 0], [2, 3, 1], [2, 3, 2], [2, 3, 3], [2, 3, 4], [2, 3, 5], [3, 0, 0], [3, 0, 1], [3, 0, 2], [3, 0, 3], [3, 0, 4], [3, 0, 5], [3, 1, 0], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 1, 4], [3, 1, 5], [3, 2, 0], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 2, 4], [3, 2, 5], [3, 3, 0], [3, 3, 1], [3, 3, 2], [3, 3, 3], [3, 3, 4], [3, 3, 5], [4, 0, 0], [4, 0, 1], [4, 0, 2], [4, 0, 3], [4, 0, 4], [4, 0, 5], [4, 1, 0], [4, 1, 1], [4, 1, 2], [4, 1, 3], [4, 1, 4], [4, 1, 5], [4, 2, 0], [4, 2, 1], [4, 2, 2], [4, 2, 3], [4, 2, 4], [4, 2, 5], [4, 3, 0], [4, 3, 1], [4, 3, 2], [4, 3, 3], [4, 3, 4], [4, 3, 5]]

创建列表

复杂写法:

cities = ["beijing","shanghai","guangzhou","shenzhen","tianjin","hong kong"]
capitalized_cities = []
for city in cities:
    capitalized_cities.append(city.title())
print(capitalized_cities)
['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Tianjin', 'Hong Kong']

简化后的写法:

capitalized_cities = [city.title() for city in cities]
print(capitalized_cities)
['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen', 'Tianjin', 'Hong Kong']

列表推导式中的条件语句

向列表推导式添加条件语句:

squares = [x**2 for x in range(9) if x % 2 == 0]
print(squares)
[0, 4, 16, 36, 64]

如果要添加 else,则需要将条件语句移到列表推导式的开头,直接放在表达式后面, 如下:

squares = [x**2 if x % 2 == 0 else x + 3 for x in range(9)]
print(squares)
[0, 4, 4, 6, 16, 8, 36, 10, 64]

使用列表推导式创建新的列表 first_names,其中仅包含 names 中的名字(小写形式)。

names = ["Rick Sanchez", "Morty Smith", "Summer Smith", "Jerry Smith", "Beth Smith"]
first_names = [name.split(' ')[0].lower() for name in names]
print(first_names) 
['rick', 'morty', 'summer', 'jerry', 'beth']

创建一个列表 multiples,其中包含 1-20 这20个整数的3倍的整数。

multiples = [3 * num for num in range(1, 21)]
print(multiples)
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60]

从字典创建列表

姓名、得分保存在一个字典中

scores = {"Rick Sanchez": 70,"Morty Smith": 35,"Summer Smith": 82,"Jerry Smith": 23,"Beth Smith": 98}

从得分字典中提取所有名字

name = [name for name, _ in scores.items()]
print(name)
['Rick Sanchez', 'Morty Smith', 'Summer Smith', 'Jerry Smith', 'Beth Smith']

从得分字典中提取所有人的得分

score = [score for _, score in scores.items()]
print(score)
[70, 35, 82, 23, 98]

创建一个姓名列表,其中仅包含得分不小于 65 分的名字

passed_name = [name for name, score in scores.items() if score >= 65]
print(passed_name)
['Rick Sanchez', 'Summer Smith', 'Beth Smith']

嵌套列表

找到嵌套列表中名字含有两个‘e’的所有名字

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([name for lst in names for name in lst if name.count('e') >= 2])
# 注意遍历顺序,这是实现的关键
['Jefferson', 'Wesley', 'Steven', 'Jennifer']

包含符号

[[] for _ in range(10)]

结果

[[], [], [], [], [], [], [], [], [], []]
test = [_ for _ in range(10)]
print(test)
'''
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
'''
# -*- coding: cp936 -*-
a = [0,1,2,3,4,5]

a_even_id = [ i for i,x in enumerate(a) if x%2 == 0 ]
print('Output1:',a_even_id)
Output1: [0, 2, 4]

# numerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据
a_even_id = [ (i,x) for i,x in enumerate(a) if x%2 == 0 ]
print('Output1.1:',a_even_id)
Output1.1: [(0, 0), (2, 2), (4, 4)]

a_even_id = [ i for i in a if i%2 == 0 ]
print('Output2:',a_even_id)
Output2: [0, 2, 4]

a_even_id = [ (i+ x) for i in a if i%2 == 0 for x in a if x%2 == 1 ]
print('Output3:',a_even_id)
Output3: [1, 3, 5, 3, 5, 7, 5, 7, 9]

a = [(x,y) for x in range(3) for y in range(3)]
print('Output4:',a)
Output4: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

a = []
for x in range(1,100,3):
    a.append([x,x+1,x+2])
print('Output5:',a)
Output5: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24], [25, 26, 27], [28, 29, 30], [31, 32, 33], [34, 35, 36], [37, 38, 39], [40, 41, 42], [43, 44, 45], [46, 47, 48], [49, 50, 51], [52, 53, 54], [55, 56, 57], [58, 59, 60], [61, 62, 63], [64, 65, 66], [67, 68, 69], [70, 71, 72], [73, 74, 75], [76, 77, 78], [79, 80, 81], [82, 83, 84], [85, 86, 87], [88, 89, 90], [91, 92, 93], [94, 95, 96], [97, 98, 99]]

# 列表推导式
a = [[x,x+1,x+2] for x in range(1,100,3)]
print('Output6:',a)
Output6: [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12], [13, 14, 15], [16, 17, 18], [19, 20, 21], [22, 23, 24], [25, 26, 27], [28, 29, 30], [31, 32, 33], [34, 35, 36], [37, 38, 39], [40, 41, 42], [43, 44, 45], [46, 47, 48], [49, 50, 51], [52, 53, 54], [55, 56, 57], [58, 59, 60], [61, 62, 63], [64, 65, 66], [67, 68, 69], [70, 71, 72], [73, 74, 75], [76, 77, 78], [79, 80, 81], [82, 83, 84], [85, 86, 87], [88, 89, 90], [91, 92, 93], [94, 95, 96], [97, 98, 99]]

#列表推导式和生成器表达式
data = ['abc','def','I use python', 'hong201']
print('Output7:',sum([len(word) for word in data]))
print('Output8:',sum(len(word) for word in data))
Output7: 25
Output8: 25

# 质数的序列
noprimes = []
for i in range(2, 8):
    for j in range(i*2, 50, i):
        noprimes.append(j)
primes = []
for x in range(2, 50):
    if x not in noprimes:
        primes.append(x)
print('Output9:',noprimes)
print('Output10:',primes)
Output9: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 10, 15, 20, 25, 30, 35, 40, 45, 12, 18, 24, 30, 36, 42, 48, 14, 21, 28, 35, 42, 49]
Output10: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
# 等价于用两个列表推导式,两个for循环的列表推导式
noprimes = [j for i in range(2, 8) for j in range(i*2, 50, i)] #注意i,j的顺序
primes = [x for x in range(2, 50) if x not in noprimes]
print('Output11:',noprimes)
print('Output12:',primes)
Output11: [4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 10, 15, 20, 25, 30, 35, 40, 45, 12, 18, 24, 30, 36, 42, 48, 14, 21, 28, 35, 42, 49]
Output12: [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]

# 生成如下数组
matrix = [[0,1,2,3], [4,5,6,7], [8,9,10,11]]
flattened = []
for row in matrix:
    for i in row:
        flattened.append(i)
        
print('Output13:',flattened)
Output13: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

flattened = [i for row in matrix for i in row]
print('Output14:',flattened)
Output14: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

a = [i for i in range(100)if not(i % 2) and i % 3]
print('Output15:',a)
'''
Python中的真假测试对于整数而言,0为假,非0为真。对于 ( if not(i % 2) and (i % 3)) 式子
not (i%2)为真的条件是:not 0 ;即需要i%2==0,即i能被2整除;i%3为真的条件是i%3 != 0,即i不能被3整除。
'''
Output15: [2, 4, 8, 10, 14, 16, 20, 22, 26, 28, 32, 34, 38, 40, 44, 46, 50, 52, 56, 58, 62, 64, 68, 70, 74, 76, 80, 82, 86, 88, 92, 94, 98]

# 两个for循环+双重if 列表推导式
result = [(x,y)
          for x in range(10)
          for y in range(10)
          if x + y == 5 
          if x > y]
print('Output16:',result)
Output16: [(3, 2), (4, 1), (5, 0)]

# if 和 for 的组合写法
x=[1,2,3,4,5]
y=[5,6,7,8,9]

c=[a+b for a in x for b in y if a%2==1 and b%2==1] # 让着两个list中的奇数分别相加
print(c)
Output17:[6, 8, 10, 8, 10, 12, 10, 12, 14]
# 作为对比:
c=[a+b for a in x for b in y ]
print(c)
Output18:[6, 7, 8, 9, 10, 7, 8, 9, 10, 11, 8, 9, 10, 11, 12, 9, 10, 11, 12, 13, 10, 11, 12, 13, 14]


# 计算100以内数据之和
print(sum(x for x in range(101)))
5050

练习题:

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

[name.upper() for name in names if len(name)>3]

求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表

[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1]

求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]

[row[2] for row in M] 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值