python列表set函数用法_python中的列表解析与列表,字典,集合筛选数据

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]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值