写在前面的:
本文用到的数据,可以加QQ跟群主获取:
群名称:
PYTHONERS-数据
群 号:
663468799
获取lynda官网会员的方式:lynda.com会员私人定制淘宝链接
本文将使用legislators.csv数据集,数据预览:
数据集包括以下列:
- last_name - 立法者的姓氏
- first_name - 立法者的名字
- birthday - 立法者的生日
- gender - 立法者的性别
- type- 立法者服务的议会 - 参议院(sen)或众议院(rep)
- state - 立法者所代表的国家
- party - 立法者的党派隶属
- birth_year- 立法者出生年份的整数值
本文将利用这些数据,找出每个性别的美国立法者中最常见的名字。
1. 枚举的概念
很多情况下,我们都需要遍历列表,比如:
在上面的例子中,有两个列表;第二个列表描述了第一个列表中动物的凶恶等级。“dog"的恶性等级为1, "superlion"的恶性等级为10,。我们希望通过找到animal中某个动物的位置。以方便我们在vicioursness中查找该动物的恶性等级。
遗憾的是,我们不能通过循环animal进去viciousness. Python中提供了一个enumerate()的函数可以解决这个问题。enumerate函数使得我们在一个for loop中拥有两个变量--索引和值,如下:
以下是该循环的示意图:
在循环的每次迭代中,值
i
将成为
animals
与该迭代对应
的索引的值
。
animal
将承担
animals
对应于索引
的值
。
在本示例中,我们使用索引变量
i
对
viciousness
列表
进行索引
,并打印对应于同一索引的值
animals
。
2. 枚举应用场景--在list of list 中添加列
我们可以使用enumerate()函数为list of list添加列。如下:
我们可以通过在每个内部list中添加一个数据,相当于添加了一个列:
在上面的代码中,我们:
- 使用枚举()函数来循环遍历每个项目cars。
- 找到door_count具有索引i(与当前项目相同的索引cars)的相应值。
- 将door_count索引值添加i到car。
- 代码运行后,每一行将cars有一door_count列。
3. 列表推导式
我们可以通过一下代码计算列表中各个元素的长度:
使用以上代码,我们需要4行代码,使用列表推导式,我们只需要1行代码,如下:
下图表示了列表推导式的执行过程:
逻辑上,列表理解:
- 循环遍历animals 列表中的每个元素,并将当前元素分配给animal
- 查找每个字符串的长度animal
- 生成一个包含所有长度作为元素的新列表
- 分配新的列表,以animal_lengths
列表的理解是更紧凑的语法,并且可以节省空间,当需要写多个for循环的时候。
4.练习如何统计CSV文件名字出现的次数
name_counts = {} #创建一个空的字典
for row in legislators:
if row[3] == "F" and row[7] > 1940: # 判断是否为女性且是否为1940后出生
name = row[1]
if name in name_counts:
name_counts[name] += 1
else:
name_counts[name] = 1 # 统计满足条件的数量
print(name_counts)
5. None对象
假设我们正在尝试在列表中找到最大值。
我们可能会写一些如下所示的代码:
我们设定
max_value
一个低价值,使一切都比它大。
但是如果我们稍微改变价值观点呢?
在上述情况下,
max_value
是
0
当循环结束。
这是错的,因为
0
不在
values
;
它只是我们用来初始化的占位符
max_value
。
该
None
对象表示该变量没有值。
而不是使用正常的double等号
(
==
)
来检查值是否等于
None
,我们使用
variable is None
语法。
的
是
对对象的相等比较运算检查。
使用
is
而不是
==
阻止一些自定义类解析到
True
与之比较
None
。
我们将
None
在以后的任务中
探索如何使用
更深入
的
对象的
操作符
。
现在,让我们看看
variable is None
语法如何:
在上面的例子中,我们:
- 初始化max_value为None。
- 循环通过每个项目values。
- 使用语法检查是否max_value相等。Nonemax_value is None
- 如果max_value等于无,或者如果i > max_value,那么我们分配的值i来max_value。
- 在循环结束时,max_value将相等-50,这是最大的值values。
因此,当一个值可能是可能的
None
,并且我们想将它与另一个值进行比较时,我们应该始终包括检查它是否实际上是
None
第一个的
代码
。
我们可以使用两个布尔型语句来加入
or
。
这里有一个例子:
max_value is None or i > max_value
Python解释器将按顺序评估两个语句。
如果第一个陈述是
True
,它不会评估第二个。
这节省了时间,因为当一个语句是
True
,整个
or
条件是
True
。
下面的代码将分配
True
到
b
,如果
a
是
None
,或者如果
a
是大于
10
:
相同的逻辑适用于一个
and
语句。
因为这两个条件必须是
True
,如果第一个是
False
,Python解释器将不会评估第二个。
下面的示例显示了如何编写一个
and
涉及
None
该
语句的语句
不会返回错误。
它将分配
True
到
b
如果
a
不等于
None
并且
a
大于
10
:
6.综合练习
- 创建一个调用的字典male_name_counts。
- loop legislators。
- 计算"M"性别列中的每个名称和1940发生后的出生年份的次数。
- 存储结果male_name_counts。
- 找到最高值male_name_counts并分配给它highest_male_count。
- 从追加的任何键male_name_counts以等于一个值highest_male_count到top_male_names。
top_male_names = []
male_name_counts = {}
for row in legislators:
if row[3] == "M" and row[7] > 1940:
name = row[1]
if name in male_name_counts:
male_name_counts[name] += 1
else:
male_name_counts[name] = 1
highest_male_count = None
for name, count in male_name_counts.items():
if highest_male_count is None or count > highest_male_count:
highest_male_count = count
for name, count in male_name_counts.items():
if count == highest_male_count:
top_male_names.append(name)
print(top_male_names)