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 总结

就所用时间来说:列表解析

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分以上的成绩表

参考慕课的python课程

:)

来个复杂的,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]]