基于字典项值控制为字典列表添加新数值ID的技术问询
基于字典项值分配自定义ID的解决方案
看起来你想要根据字典里的HID这类字段来定制id的分配逻辑,而不是简单的连续递增。我给你整理了几种常见场景的解决方案,你可以根据自己的实际需求选择:
首先先明确你的原始数据和当前遇到的问题:
我拥有一个包含各年份家庭标识(HID)的字典列表:
list_of_dicts = [{'HID':'1','year':'2017'}, {'HID':'1','year':'2018'}, {'HID':'2','year':'2017'}, {'HID':'2','year':'2018'}, {'HID':'3','year':'2017'}, {'HID':'3','year':'2018'}]我需要遍历每个字典并添加一个新的数值型id,且希望基于其他项的值来控制该id的分配。我尝试了如下代码:
i = 0 for line in list_of_dicts: line['id'] = i i += 1但该代码会生成连续递增的id,无法满足基于其他项值控制的需求。
场景1:同一个HID对应同一个ID
如果希望所有拥有相同HID的字典条目共享同一个id,可以用一个辅助字典来记录每个HID对应的id值。遍历的时候检查当前HID是否已经在辅助字典里:存在就直接用对应的id,不存在就分配新的id并更新辅助字典。
代码示例:
list_of_dicts = [{'HID':'1','year':'2017'}, {'HID':'1','year':'2018'}, {'HID':'2','year':'2017'}, {'HID':'2','year':'2018'}, {'HID':'3','year':'2017'}, {'HID':'3','year':'2018'}] # 辅助字典,映射HID到对应的id hid_to_id = {} current_id = 0 for line in list_of_dicts: hid = line['HID'] if hid not in hid_to_id: hid_to_id[hid] = current_id current_id += 1 line['id'] = hid_to_id[hid] # 查看结果 for item in list_of_dicts: print(item)
运行后输出结果:
{'HID': '1', 'year': '2017', 'id': 0} {'HID': '1', 'year': '2018', 'id': 0} {'HID': '2', 'year': '2017', 'id': 1} {'HID': '2', 'year': '2018', 'id': 1} {'HID': '3', 'year': '2017', 'id': 2} {'HID': '3', 'year': '2018', 'id': 2}
场景2:按HID+Year组合分配唯一ID
如果需要每个(HID, year)的组合对应唯一的id(这种情况其实和你原来的连续id结果一致,但逻辑是基于字段组合来分配的),同样用辅助字典来记录组合与id的映射:
list_of_dicts = [{'HID':'1','year':'2017'}, {'HID':'1','year':'2018'}, {'HID':'2','year':'2017'}, {'HID':'2','year':'2018'}, {'HID':'3','year':'2017'}, {'HID':'3','year':'2018'}] # 辅助字典,映射(HID, year)组合到对应的id combo_to_id = {} current_id = 0 for line in list_of_dicts: combo = (line['HID'], line['year']) if combo not in combo_to_id: combo_to_id[combo] = current_id current_id += 1 line['id'] = combo_to_id[combo] # 查看结果 for item in list_of_dicts: print(item)
运行后输出结果:
{'HID': '1', 'year': '2017', 'id': 0} {'HID': '1', 'year': '2018', 'id': 1} {'HID': '2', 'year': '2017', 'id': 2} {'HID': '2', 'year': '2018', 'id': 3} {'HID': '3', 'year': '2017', 'id': 4} {'HID': '3', 'year': '2018', 'id': 5}
场景3:按HID分组,组内按Year递增ID
如果希望同一个HID下,按年份的顺序分配组内的id(比如HID=1的2017对应id=0,2018对应id=1;HID=2的2017也对应id=0,以此类推),可以用嵌套的辅助字典来记录每个HID下各年份对应的id:
list_of_dicts = [{'HID':'1','year':'2017'}, {'HID':'1','year':'2018'}, {'HID':'2','year':'2017'}, {'HID':'2','year':'2018'}, {'HID':'3','year':'2017'}, {'HID':'3','year':'2018'}] # 嵌套辅助字典:hid -> {year: id} hid_year_id = {} for line in list_of_dicts: hid = line['HID'] year = line['year'] # 初始化当前HID的子字典 if hid not in hid_year_id: hid_year_id[hid] = {} # 如果当前年份没记录过,按已有的年份数量分配新id(确保顺序正确) if year not in hid_year_id[hid]: hid_year_id[hid][year] = len(hid_year_id[hid]) line['id'] = hid_year_id[hid][year] # 查看结果 for item in list_of_dicts: print(item)
运行后输出结果:
{'HID': '1', 'year': '2017', 'id': 0} {'HID': '1', 'year': '2018', 'id': 1} {'HID': '2', 'year': '2017', 'id': 0} {'HID': '2', 'year': '2018', 'id': 1} {'HID': '3', 'year': '2017', 'id': 0} {'HID': '3', 'year': '2018', 'id': 1}
内容的提问来源于stack exchange,提问作者Thirst for Knowledge
相关产品推荐
相关产品推荐

