python学习笔记——列表生成式的使用

列表生成式12个案列

前言

Python 里使用 [] 创建一个列表。容器类型的数据进行运算和操作,生成新的列表最高效的办法——列表生成式

列表生成式优雅、简洁,值得多多使用!

基础部分

1. 数据再运算

实现对每个元素的乘方操作后,利用列表生成式返回一个新的列表。

In [1]: a = range(0,11)

In [2]: b = [x**2 for x in a] # 利用列表生成式创建列表

In [3]: b
Out[3]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

数值型的元素列表,转换为字符串类型的列表:

In [1]: a = range(0,10)

In [2]: b = [str(i) for i in a]

In [3]: b
Out[3]: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
2. 一串随机数

生成 10 个 0 到 1 的随机浮点数,保留小数点后两位:

from random import random
a = [round(random(),2) for _ in range(10)]

生成 10 个 0 到 10 的满足均匀分布的浮点数,保留小数点后两位:

from random import uniform
a = [round(uniform(0,10),2) for _ in range(10)]
3. if 和嵌套 for

列表生成式中嵌套if语句:
对一个列表里面的数据筛选,只计算 [0,11) 中偶数的平方:

a = range(11)
c = [x**2 for x in a if x%2==0]
print(c)
>> [0, 4, 16, 36, 64, 100]

列表生成式中嵌套 for语句:
如下使用嵌套的列表,一行代码生成 99 乘法表的所有 45 个元素:

a = [i*j for i in range(10) for j in range(1,i+1)] 
>> 
4. zip 和列表

zip(*iterables)——创建返回一个迭代器,聚合每个可迭代对象的元素。

#zip单独使用
a = [0, 1, 2, 3]
b = ['a', 'b', 'c', 'd']
print(list(zip(a,b)))
>> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
#列表生成式结合zip函数使用
a = range(5)
b = ['a','b','c','d','e']
c = [str(y) + str(x) for x, y in zip(a,b)]
print(c)
>> ['a0', 'b1', 'c2', 'd3', 'e4']
5. 打印键值对
a = {'a':1,'b':2,'c':3}
b = [k+ '=' + str(v) for k, v in a.items()]
print(b)
>> ['a=1', 'b=2', 'c=3']
6. 文件列表
import os
a = [d for d in os.listdir('D:/source/test')]

再结合 if,返回文件夹的名字列表:

import os
dirs = [d for d in os.listdir('D:/source/test') if os.path.isdir(d)]
print(dirs)
>> ['.vscode', 'templates', '__pycache__']

只查找出文件。

import os
files = [d for d in os.listdir('D:/source/test') if os.path.isfile(d)]

print(files)
>> ['a.sql','barchart.py','barstack.py','bar_numpy.py']
7. 转为小写
a = ['Hello', 'World', '2019Python']
b = [w.lower() for w in a]
print(b)
>> ['hello', 'world', '2019python']

该写法可能会有问题,因为 Python 的列表类型可以不同,如果列表 a:

a = ['Hello', 'World',2020,'Python']

[w.lower() for w in a]
---------------------------------------------------------------------------
AttributeError: 'int' object has no attribute 'lower'

如上就会出现 int 对象没有方法 lower 的问题,先转化元素为 str 后再操作:

a = [str(w).lower() for w in a]
print(a)
>> ['hello', 'world', '2020', 'python']

更友好的做法,使用 isinstance,判断元素是否为 str 类型,如果是,再调用 lower 做转化:

a = [w.lower() for w in a if isinstance(w,str) ]
print(a)
>> ['hello', 'world', 'python']
8. 保留唯一值
def filter_non_unique(lst):
   return [item for item in lst if lst.count(item) == 1]

filter_non_unique([1, 2, 2, 3, 4, 4, 5])
>> [1, 3, 5]

高级部分

9. 筛选分组
def bifurcate(lst, filter):
    return [
        [x for i,x in enumerate(lst) if filter[i] == True],
        [x for i,x in enumerate(lst) if filter[i] == False]
        ]

b = bifurcate(['beep', 'boop', 'foo', 'bar'], [True, True, False, True])
print(b)
>> [['beep', 'boop', 'bar'], ['foo']]
10. 函数分组
def bifurcate_by(lst, fn):
	return [
		[x for x in lst if fn(x)],
		[x for x in lst if not fn(x)]
		]

b = bifurcate_by(['Python3', 'up', 'users', 'people'], lambda x: x[0] == 'u')
print(b)
>> [['up', 'users'], ['Python3','people']]
11. 差集
def difference(a, b):
	_a, _b =set(a),set(b)
	return [item for item in _a if item not in _b]

b = difference([1,1,2,3,3], [1, 2, 4])
print(b)
>> [3]
12. 函数差集

列表 a、b 中元素经过 fn 映射后,返回在 a 不在 b 中的元素。

from math import floor
def difference_by(a, b, fn):
		_b = set(map(fn, b))
		return [item for item in a if fn(item) not in _b]

#列表元素为单个元素:
b = difference_by([2.1, 1.2], [2.3, 3.4],floor)
print(b)
>> [1.2]

#列表元素为字典:
c = difference_by([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], lambda v : v['x'])
print(c)
>>  [{'x': 2}]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值