Notes on Python Basics -Day 5

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值