List comprehension
Author: Denny YU
Created
文章目录
Target1:理解并掌握使用List Comprehension
Techs you will learn:
- loops and map()
- 比较comprehensions、循环和map()
- 为表达式添加逻辑条件
- 使用表达式替代filter():
- 性能相关问题
1.如何创建列表
-
For loops
1.创建一个空列表,2. 循环遍历可迭代对象或者range对象所有元素, 3. append()方法将元素添加至列表的末尾
>>> a=[] >>> for i in range(10): a.append(i) >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2.List comprehension
>>> a=[x for x in range(10)] >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3.使用map()对象
map()基于函数式编程是一种可替代的方法,用法为map(function, Iterable)创建一个map对象, function是作用在Iterable的每个元素上的。map()对象是一个Iterator (迭代器)
>>> txns=[1.09,23.56,57.84,4.56,6.78] >>> TAX_RATE=.08 >>> def get_price_with_tax(X): ... return X*(1+TAX_RATE) ... >>> final_prices = map(get_price_with_tax,txns) >>> list(final_prices) [1.1772000000000002, 25.4448, 62.467200000000005, 4.9248, 7.322400000000001] >>> list(final_prices) []
使用lambda表达式加map()
>>> a1=map(lambda x: x*x if x%2 ==0 else x,range(10)) >>> [e for e in a1] [0, 1, 4, 3, 16, 5, 36, 7, 64, 9]
2. List Comprehension更进阶的用法
-
使用简单逻辑条件
# 添加if >>> [x for x in range(10) if x%2==0] [0, 2, 4, 6, 8] ## 添加if else >>> [x if x%2==0 else x*2 for x in range(10)] [0, 2, 2, 6, 4, 10, 6, 14, 8, 18]
-
使用更加复杂的逻辑条件,可以在列表推导式外面写一个更加复杂的函数
>>> def change_number(x): if x==0: x=1 elif x==1: x=2 elif x==2: x=3 elif x==3: x=4 else: x=5 return x >>> a=[change_number(x) for x in range(9)] >>> a [1, 2, 3, 4, 5, 5, 5, 5, 5]
-
使用Set 和Dictionary Comprehensions
Set表达式用法和list表达式十分相似但是最终的结果去除了重复的元素,注意集合是无序的
>>> {x for x in list(range(10))*2} {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} >>> quote = "life, uh, finds a way" >>> unique_vowels = {i for i in quote if i in 'aeiou'} >>> unique_vowels {'u', 'i', 'a', 'e'}
-
使用dictionary comprehension
>>> squares = {i:i**i for i in range(8)} >>> squares {0: 1, 1: 1, 2: 4, 3: 27, 4: 256, 5: 3125, 6: 46656, 7: 823543}
>>> x=("name","age","job",'class') >>> y=("jing",18,'student','Chem-02') >>> {i:j for i,j in zip(x,y)} {'name': 'jing', 'age': 18, 'job': 'student', 'class': 'Chem-02'}
-
Walrus Operator 代替filter功能
假设需要通过API发出五个请求返回温度值, 但是只需要在温度大于20摄氏度时返回,返回的值时该温度的两倍值,否则返回“***”,则
>>> y=['shanghai','beijing','chongqing','guangzhou','nanjing'] >>> x=[34,25,36,40,20] >>> [a*2 if(a:=i[0])>20 else '***' for i in zip(x,y)] [68, 50, 72, 80, '***']
3. 嵌套的列表表达式
-
嵌套的表达式
列表嵌套在字典内
>>> cities = ['shanghai','beijing','chongqing','changchun','nanchang'] >>> temps={city:[0 for i in range(len(cities))] for city in cities} >>> temps {'shanghai': [0, 0, 0, 0, 0], 'beijing': [0, 0, 0, 0, 0], 'chongqing': [0, 0, 0, 0, 0], 'changchun': [0, 0, 0, 0, 0], 'nanchang': [0, 0, 0, 0, 0]}
列表嵌套在列表内(注意for 循环的运行顺序)
[x for x in range(5) for y in range(10)] 右边是内循环左边外循环 [[x for y in range(10)] for x in range(5)] 右边外循环左边内循环 >>> [x for x in range(2) for y in range(3)] [0, 0, 0, 1, 1, 1] >>> [x for y in range(2) for x in range(3)] [0, 1, 2, 0, 1, 2] >>> [[x for y in range(3)] for x in range(2)] [[0, 0, 0], [1, 1, 1]]
有嵌套也可以flatten
>>> a=[[x for y in range(3)] for x in range(2)] >>> a [[0, 0, 0], [1, 1, 1]] >>> flat=[num for x in a for num in x ] >>> flat [0, 0, 0, 1, 1, 1]
4. map,Loops和list comprehension运行效率的比较
一般map>comprehensions>Loops
import random
import timeit
TAX_RATE = .08
txns = [random.randrange(100) for i in range(10000)]
def get_price(txn):
return txn*(1+TAX_RATE)
def get_price_with_map():
return list(map(get_price, txns))
def get_price_with_map1():
return list(map(lambda x:x*(1+TAX_RATE), txns))
def get_price_with_comprehension():
return [get_price(txn) for txn in txns]
def get_price_with_loop():
prices = []
for txn in txns:
prices.append(get_price(txn))
return prices
print(timeit.timeit(get_price_with_map,number=1000))##timeit 运行1000次的时间之和
print(timeit.timeit(get_price_with_map1,number=1000))
print(timeit.timeit(get_price_with_comprehension,number=1000))
print(timeit.timeit(get_price_with_loop,number=1000))
输出:0.9589426000000001
输出:1.0550914
输出:1.2540461
输出:1.6051032999999997