利用python做数据分析中如何理解列表,列表推导式

23 篇文章 0 订阅
10 篇文章 0 订阅
写在前面的:

本文用到的数据,可以加QQ跟群主获取:

群名称: PYTHONERS-数据
群   号: 663468799
学习python和数据分析推荐地方:   www.lynda.com   
获取lynda官网会员的方式:lynda.com会员私人定制淘宝链接

本文将使用legislators.csv数据集,数据预览:
last_name , first_name , birthday , gender , type , state , party , birth_year
Bassett , Richard , 1745 - 0 4 - 0 2 , M , sen , DE , Anti - Administration , 1745
Bland , Theodorick , 1742 - 0 3 - 21 , M , rep , VA , 1742
Burke , Aedanus , 1743 - 0 6 - 16 , M , rep , SC , 1743
Carroll , Daniel , 1730 - 0 7 - 22 , M , rep , MD , 1730
数据集包括以下列:
  • last_name - 立法者的姓氏
  • first_name - 立法者的名字
  • birthday - 立法者的生日
  • gender - 立法者的性别
  • type- 立法者服务的议会 - 参议院(sen)或众议院(rep
  • state - 立法者所代表的国家
  • party - 立法者的党派隶属
  • birth_year- 立法者出生年份的数值
本文将利用这些数据,找出每个性别的美国立法者中最常见的名字。

1. 枚举的概念
很多情况下,我们都需要遍历列表,比如:
animals = [ "Dog" , "Tiger" , "SuperLion" , "Cow" , "Panda" ]
viciousness = [ 1 , 5 , 10 , 10 , 1 ]
for animal in animals :
print ( "Animal" )
print ( animal )
print ( "Viciousness" )
在上面的例子中,有两个列表;第二个列表描述了第一个列表中动物的凶恶等级。“dog"的恶性等级为1, "superlion"的恶性等级为10,。我们希望通过找到animal中某个动物的位置。以方便我们在vicioursness中查找该动物的恶性等级。
遗憾的是,我们不能通过循环animal进去viciousness. Python中提供了一个enumerate()的函数可以解决这个问题。enumerate函数使得我们在一个for loop中拥有两个变量--索引和值,如下:
for i , animal in enumerate ( animals ):
print ( "Animal Index" ) ## label
print ( i )
print ( "Animal" ) ## label
print ( animal )
  
以下是该循环的示意图:
在循环的每次迭代中,值 i 将成为 animals 与该迭代对应 的索引的值   animal 将承担 animals 对应于索引 的值
这是另一个例子,我们如何使用 枚举() 函数来串行迭代多个 列表
animals = [ "Dog" , "Tiger" , "SuperLion" , "Cow" , "Panda" ]
viciousness = [ 1 , 5 , 10 , 10 , 1 ]
for i , animal in enumerate ( animals ):
print ( "Animal" )
print ( animal )
print ( "Viciousness" )
print ( viciousness [ i ])
在本示例中,我们使用索引变量 i viciousness   列表 进行索引 ,并打印对应于同一索引的值 animals

2. 枚举应用场景--在list of list 中添加列
我们可以使用enumerate()函数为list of list添加列。如下:
door_count = [ 4 , 4 ]
cars = [
[ "black" , "honda" , "accord" ],
[ "red" , "toyota" , "corolla" ]
]
我们可以通过在每个内部list中添加一个数据,相当于添加了一个列:
for i , car in enumerate ( cars ):
car . append ( door_count [ i ])
在上面的代码中,我们:
  • 使用枚举()函数来循环遍历每个项目cars
  • 找到door_count具有索引i(与当前项目相同的索引cars)的相应值。
  • door_count索引值添加icar
  • 代码运行后,每一行将cars有一door_count列。

3. 列表推导式

我们可以通过一下代码计算列表中各个元素的长度:
animals = [ "Dog" , "Tiger" , "SuperLion" , "Cow" , "Panda" ]
animal_lengths = []
for animal in animals :
animal_lengths . append ( len ( animal ))
使用以上代码,我们需要4行代码,使用列表推导式,我们只需要1行代码,如下:
animal_lengths = [ len ( animal ) for animal in animals ]
下图表示了列表推导式的执行过程:
逻辑上,列表理解:
  • 循环遍历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对象
假设我们正在尝试在列表中找到最大值。 我们可能会写一些如下所示的代码:
values = [ 50 , 80 , 100 ]
max_value = 0
for i in values :
if i > max_value :
max_value = i
我们设定 max_value 一个低价值,使一切都比它大。 但是如果我们稍微改变价值观点呢?
values = [ - 50 , - 80 , - 100 ]
max_value = 0
for i in values :
if i > max_value :
max_value = i
在上述情况下, max_value 0 当循环结束。 这是错的,因为 0 不在 values ;   它只是我们用来初始化的占位符 max_value
我们可以使用 None 对象 来解决这种问题 ,该对象有一个名为 NoneType 的特殊数据类型
None 对象表示该变量没有值。 而不是使用正常的double等号 == 来检查值是否等于 None ,我们使用 variable is None 语法。
对对象的相等比较运算检查。 使用 is 而不是 == 阻止一些自定义类解析到 True 与之比较 None 我们将 None 在以后的任务中 探索如何使用 更深入 对象的 操作符 现在,让我们看看 variable is None 语法如何:
values = [ - 50 , - 80 , - 100 ]
max_value = None
for i in values :
if max_value is None or i > max_value :
max_value = i
在上面的例子中,我们:
  • 初始化max_valueNone
  • 循环通过每个项目values
  • 使用语法检查是否max_value相等。Nonemax_value is None
  • 如果max_value等于无,或者如果i > max_value,那么我们分配的值imax_value
  • 在循环结束时,max_value将相等-50,这是最大的值values
将值比较为 通常会产生错误。 当我们编写代码时,这实际上是有帮助的,因为它可以防止意外的变量为 None 例如,此代码将导致错误:
a = None
a > 10
因此,当一个值可能是可能的 None ,并且我们想将它与另一个值进行比较时,我们应该始终包括检查它是否实际上是 None 第一个的 代码
我们可以使用两个布尔型语句来加入 or 这里有一个例子:
max_value is None or i > max_value
Python解释器将按顺序评估两个语句。 如果第一个陈述是 True ,它不会评估第二个。 这节省了时间,因为当一个语句是 True ,整个 or 条件是 True
下面的代码将分配 True b ,如果 a None ,或者如果 a 是大于 10
a = None
b = a is None or a > 10
相同的逻辑适用于一个 and 语句。 因为这两个条件必须是 True ,如果第一个是 False ,Python解释器将不会评估第二个。 下面的示例显示了如何编写一个 and 涉及 None 语句的语句 不会返回错误。 它将分配 True b 如果 a 不等于 None 并且 a 大于 10
a = None
b = a is not None and a > 10


6.综合练习
  • 创建一个调用的字典male_name_counts
  • loop legislators
    • 计算"M"性别列中的每个名称和1940发生后的出生年份的次数。
    • 存储结果male_name_counts
  • 找到最高值male_name_counts并分配给它highest_male_count
  • 从追加的任何键male_name_counts以等于一个值highest_male_counttop_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)














  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值