python中的列表解析与列表,字典,集合筛选数据
1.列表list
from random import randint
data = [randint(-100,70) for i in range(12)]
print(data)
randint()
生成指定范围下(-100,70)的指定个数为(12)的随机数
其中i 可以是其它字母(x,y,z,...都可以),代表每次被迭代的数,打印如下
>>> data
[62, -1, -9, 17, -93, -62, -31, -91, -31, -20, -62, 11]
1.1普通方法
先用普通方法来看看筛选出大于0的
res = []
for x in data:
if x>= 0:
res.append(x)
print(res)
结果如下
>>> res
[62, 17, 11]
1.2列表解析
现在用列表解析的方式筛选出大于0的,对比一下
print([x for x in data if x >= 0])
print(data)
结果如下
>>> [x for x in data if x >= 0]
[62, 17, 11]
>>> data
[62, -1, -9, 17, -93, -62, -31, -91, -31, -20, -62, 11]
我们可以看到data其实并没有变化
我们来看一下列表解析这种结构
[x for x in data if x >= 0]
再做一个小实验
>>> [x+3 for x in data if x >= 0]
[65, 20, 14]
我们把x换成了x+3,打印的每一项里也+3了,也就可以更好的理解这其中的原理了
其实这个列表解析具体来说再执行过程中分了3个步骤:
1.通过for x in data
来遍历data
2.加入if语句if x >= 0
来筛选
3.通过x+3
这样一个表达式来循环输出到空列表[]
中
1.3 Filter函数
1.3.1 lambda表达式
在这之前我们有必要了解一下lambda x: x >= 0
这是什么东西
lambda表达式其实就是匿名函数,其中:
冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值。
在此例中x
即为参数 x >= 0
为返回值。我们再来看一个稍微复杂的例子:
lamxy=lambda x,y: x*y*x
lamxy(2,1)
优点:
1.一个函数只会使用一次的话,比较简洁,不用多定义了一个函数
2.lambda表达式可以和filter map结合使用
1.4 总结
就所用时间来说:列表解析<filter函数<普通方法,比较推荐列表解析
1.3.2 使用filter函数
>>> filter(lambda x: x >= 0,data)
[62, 17, 11]
filter,可以理解成过滤
filter函数会对data中的每个元素调用lambda函数,最后返回调用结果为true的元素,
在这里,即是x >=0
元素。
注意上面是python2下的结果,python3中filter函数返回的是一个对象,需做类型转换,如下
res = filter(lambda x: x >= 0,data)
print(list(res))
这样在python3中打印出[62, 17, 11]
的结果
2 集合set
python2下
>>> data
[62, -1, -9, 17, -93, -62, -31, -91, -31, -20, -62, 11]
>>> s = set(data)
>>> s
set([-31, -62, -93, -91, 11, -20, 17, 62, -9, -1])
>>> {x for x in s if x % 3 == 0}
set([-93, -9])
python3下
>>> s = set(data)
>>> s
{-31, -62, -93, -91, 11, -20, 17, -1, -9, 62}
>>> {x for x in s if x % 3 == 0}
{-93, -9}
这里我们还是用上一小节的data
,可以看到set()
方法有明显区别,python2下转化成了元祖,有点不好理解。python3下则转化为了集合,而集合的定义是:由不同元素组成的集合,故只有10个集合元素(另外2个因为重复,被去掉了)
1.
{x for x in s if x % 3 == 0}
的理解和上面的列表解析list是一样的
2.有区别的是这里因为是集合set,所以外面是{ }
包起来的
3.x % 3 == 0
是指能被3整除
3 字典dict
再打开一个新的文件
代码如下:
from random import randint
data ={x: randint(80,100) for x in range(1,9)}
print(data)
print({x for x in data if x >= 6})
#python3中不再有iteritems() ,用items()代替python2中的iteritems()方法
print({key: value for key,value in data.items() if value > 90})
打印结果如下:
{1: 87, 2: 82, 3: 82, 4: 95, 5: 100, 6: 86, 7: 94, 8: 100}
{8, 6, 7}
{8: 100, 4: 95, 5: 100, 7: 94}
可以这么理解range(1,9)
是指学号1到学号8的学生,而他们的成绩randint(80,100)
,是80分到100分的随机分数,x: randint(80,100)
这种字典键值对可以理解为成绩表,格式为学号: 成绩
{key: value for key,value in data.items() if value > 90}
中
1.字典里的
items()
方法是 返回可遍历的(键, 值) 元组数组,看个例子:
dict = {'Sex': 'man', 'Age': 999}
print (dict.items())
for x in dict.items():
print(x)
for key,value in dict.items():
print(key,value)
>打印结果:
>```
dict_items([('Sex', 'man'), ('Age', 999)])
('Sex', 'man')
('Age', 999)
Sex man
Age 999
-
if value > 90
筛选90分以上的成绩 -
key: value
可以理解为列表解析后字典里每个元素的格式 - 得到90分以上的成绩表
:)
参考:
知乎关于lambda的讨论
Python 内置函数 lambda、filter、map、reduce
Stansosleepy的python笔记_列表解析:
里面的讲解很详细:
例3,获取两个列表对应位的乘积
来个复杂的,list a=[2,3,4,5]; list b=[3,4,5,6],想要得到a,b对应位的乘积:
[i*j for i,j in zip(a,b)]
>除了列表解析,还需要使用zip函数来帮忙,zip将a,b对应位打包起来,返回[[2,3][3,4][4,5][5,6]]