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() 函数会很慢,特别是在嵌套循环中使用时,时间复杂度可能会呈指数级增长。