python的index函数使用问题

python的index() 函数使用问题

一.需求

​ 在编写项目代码时,有这么个需求:两个嵌套着字典元素的列表做对比,其中字典中有两个key是一样的,若两个字典中key对应的value值相同,则把字典中另一个指定的key和value值添加到另一个字典中,最后生成一个新的列表

|两个嵌套着字典元素的列表部分数据
csv_info = [{'xuehao': '20230513','grade': 'No', 'ind': '21523', 'zhu_grade': ''},                {'xuehao': '20230519','grade': 'No', 'ind': '21524', 'zhu_grade': ''},               
{'xuehao': '20230514','grade': 'No', 'ind': '21525', 'zhu_grade': ''},              
 {'xuehao': '20230515','grade': 'No', 'ind': '21526','zhu_grade': ''},              
{'xuehao': '20230516','grade': 'No', 'ind': '21527','zhu_grade': '100'},            
 {'xuehao': '20230517','grade': 'No', 'ind': '21528',  'zhu_grade': ''},           
 {'xuehao': '20230518','grade': 'No', 'ind': '21529',  'zhu_grade': ''}]

excel_info = [{'xuehao': '20230519','city': '', 'country': '', 'grade': '',  'region': 'hebei'},               {'xuehao': '20230518','city': '', 'country': '', 'grade': '',  'region': 'henan'},               {'xuehao': '20230517','city': '', 'country': '', 'grade': '', 'region': ''},               	    {'xuehao': '20230516','city': '', 'country': '', 'grade': '', 'region': ''},              
              {'xuehao': '20230515','city': '', 'country': '', 'grade': '', 'region': ''}]
|我的需求

​ 若两个列表数据中若字典key为xuehao对于的值有相等的,就把csv_info中key为’zhu_grade对应的value值,赋值给excel_info中的key为’grade’对应的value值,excel_info的key为’grade’是新增的key

|我写的代码
xuehao_list = [grade_xuehao['xuehao'] for grade_xuehao in excel_info]

for info in csv_info:
    if info['xuehao'] in xuehao_list:
        xuehao_index = xuehao_list.index(info['xuehao'])
        if info['zhu_grade'] != '':
            excel_info[xuehao_index]['grade'] = info['zhu_grade']
        else:
            excel_info[xuehao_index]['grade'] = 'No grade'
二.代码问题及优化方案
|问题

两个列表中字典数据量过多即当列表csv_info嵌套着95450个字典数据并且列表excel_info嵌套着 126369个字典数据时(我编写代码需要处理的数据集),程序运行会很慢。

|原因

​ index() 函数用于查找列表中某个元素第一次出现的位置,并返回其索引值。 在代码中,xuehao_index 变量存储了 csv_info 中当前迭代的字典中的 ‘xuehao’ 值在 xuehao_list 中的位置,以便将相应的 ‘zhu_grade’ 值赋给 excel_info 中相应的字典。

​ 它将在 csv_info 列表中的每个元素上运行 index() 函数,而在 xuehao_list 列表中查找每个元素的位置。
因此,如果 csv_info 列表中有很多元素,每个元素都要在 xuehao_list 中查找一次,这将导致程序运行变慢。

|优化及解决方案
1方案1

(1)代码:

# 将excel_info中的xuehao和对应的位置存储到字典xuehao_dict中
xuehao_dict = {excel_xuehao['xuehao']: i for i, excel_xuehao in enumerate(excel_info)}

# 使用字典推导式将csv_info 中的信息赋值给excel_info
for grade_info in csv_info :
    xuehao = grade_info['xuehao']
    if xuehao in xuehao_dict:
        index = xuehao_dict[xuehao]
        excel_info[index]['grade'] = grade_info['zhu_grade'] or 'No grade'

(2)说明

​ 为了提高程序的效率,可以使用字典来存储excel_info中的xuehao和对应的位置,这样可以避免每次查找xuehao所在的位置都需要遍历整个列表。另外,使用字典推导式可以更简洁地实现将csv_info 中的信息赋值给excel_info。

​ 这段代码首先创建了一个字典xuehao_dict,用于存储excel_info中每个xuehao对应的位置,其中i表示位置,excel_xuehao表示每个字典数据。然后,使用一个for循环遍历csv_info 中的每个字典数据,获取xuehao值,并在xuehao_dict中查找对应位置。如果查找到位置,则将csv_info 中的zhu_grade值赋值给excel_info中对应位置的grade键。
注意,这里使用了or运算符,如果zhu_grade值为空,则将’No grade’赋值给grade键。

2方案2

(1)代码:

# 创建xuehao地址和成绩信息的字典映射
xuehao_grade_map = {grade_info['xuehao']: grade_info['zhu_grade'] or 'No grade' for grade_info in csv_info }

# 更新excel_info列表中的成绩信息
for excel_grade in excel_info:
    xuehao = excel_grade['xuehao']
    excel_grade['grade'] = xuehao_grade_map.get(xuehao, 'No grade')

# 创建包含新键的excel_info列表
excel_info_with_grade = [{**excel_grade, 'grade': excel_grade['grade']} for excel_grade in excel_info]

(2)说明

​ 可以使用一个字典来映射xuehao和成绩信息。只需要遍历列表一次,而不需要在列表中搜索xuehao地址。此外,可以使用字典推导式来创建包含新键的excel_info列表。

​ 首先,我们使用字典推导式创建一个xuehao和成绩信息的字典映射。这个字典中的键是xuehao地址,值是成绩信息或’No grade’字符串。这个字典只需要在csv_info 列表上进行一次迭代,因此它比在excel_info列表上进行迭代更快。

​ 接下来,我们遍历excel_info列表,并为每个条目添加成绩信息。我们从当前条目的xuehao获取成绩信息,并使用字典get()方法获取映射字典中对应的值。如果映射字典中没有对应的值,则默认为’No grade’字符串。最后,我们使用字典推导式创建一个包含新键的excel_info列表。在这个列表中,我们使用**操作符将当前字典的所有键-值对添加到新字典中,并用’grade’键覆盖旧值,从而添加新键。这个修改后的代码应该会比之前的代码更快,并且输出结果中应该会包含’grade’键。

三.总结
1、index() 函数原理

​ index() 函数原理是遍历整个列表,用于查找列表中某个元素第一次出现的位置,并返回其索引值。因此,在大型数据集上运行 index() 函数会很慢,特别是在嵌套循环中使用时,时间复杂度可能会呈指数级增长。

函数原理是遍历整个列表,用于查找列表中某个元素第一次出现的位置,并返回其索引值。因此,在大型数据集上运行 index() 函数会很慢,特别是在嵌套循环中使用时,时间复杂度可能会呈指数级增长。

2、创建一个新字典来映射该字典的key和value
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值