展开全部

一、如何在列表,字典,集合中根据条件筛选数据?

问题1:

如何过e68a8462616964757a686964616f31333366303237滤掉列表[3,9,-1,10,20,-2]中的负数?

解决方法:

在Python中可以使用函数式编程,列表解析,字典解析集合解析等方式进行筛选。

1)最通常的方法:迭代

data = [3,9,-1,10,20,-2]res = []for x in data: if(x >= 0): res.append(x)print(res)

2)使用filter函数

from random import randintdata = [randint(-10,10) for x in range(10)] #在-10到10之间随机生成10个随机数newdata = list(filter(lambda x: x >= 0, data))print(newdata)

注意Python3中的filter函数返回的对象从列表改为了Iterator(迭代器),因此如果想返回一个列表,就要加上list()

3)列表解析

newdata2 = [x for x in data if x >= 0]print(newdata2)

结果和使用filter函数相同,但是使用列表解析所需的时间要比使用filter快很多,所以首选的方式就是列表解析,另外这两种方式都远快于迭代的方式。(推荐阅读:Python零基础入门在线网课)

问题2:

如何筛选出字典中值高于90的项?

解决方法:

from random import randintdic = {x: randint(60,100) for x in range(1,11)} #随机生成学号1到10的学生成绩newdic = {k:v for k,v in dic.items() if v >= 90} #同时迭代键和值,Python3中的iteritems变为itemsprint(newdic)

问题3:

如何筛选出集合{77,89,32,29,33}中能被3整除的元素?

解决方法:

s = {77,89,32,29,33}news = {x for x in s if x % 3 == 0}print(news)

二、如何为元组中的每个元素命名,提高程序的可读性?

实际案例:

如学生信息管理系统中数据为固定格式:

(名字,年龄,性别...)

学生数量很大,为了减少存储开销,对每个学生信息采用元组表示:

(‘jam’,16,’male’)
(‘tom’,18,’male’)
(‘july’,19,’female’)
...

访问元组时,需要使用索引(index)来访问,

如一个学生元组为student = ('jam',19,'male'),那么想要访问其名字时要使用student[0],访问其性别时要使用student[2]

由此带来的问题是大量的索引会降低程序的可读性,

那么如何来解决这个问题呢?

有两种解决方案:

方案1:定义枚举类型,也就是定义一系列数值常量

NAME = 0AGE = 1SEX = 2# NAME,AGE,SEX = range(1,4)student = ('jam',19,'male')print(student[NAME])print(student[AGE])

方案2:使用标准库中collections.namedtuple替代内置的tuple

from collections import namedtupleStudent = namedtuple('student',['name','age','sex']) #相当于创建了一个命名元组类,第一个参数是元组的名字,第二个参数是其属性s1 = Student('jam',18,'male') #可以直接传参s2 = Student(name='tom',age=20,sex='male') #也可以通过关键字传参print(s1.name) #通过属性来访问print(s2.age)