如何对字典df按key排序并对值内列表按首元素升序排列?
解决字典排序与文件写入的问题
要满足你的两个排序需求(按字典key升序遍历,同时对每个key对应的列表按子列表首元素升序排列),可以直接修改循环逻辑,在遍历和判断之间完成排序操作:
# 按key升序遍历df的键 for key in sorted(df.keys()): # 对当前key对应的列表,按子列表第一个元素升序排序 sorted_items = sorted(df[key], key=lambda x: x[0]) if key in hf: deliverable.write(bytes(f"{1} {bag_to_svmlight(sorted_items)}\n", 'utf-8')) else: deliverable.write(bytes(f"{0} {bag_to_svmlight(sorted_items)}\n", 'utf-8'))
关键逻辑说明
sorted(df.keys()):将df的所有键按升序排列,保证遍历顺序为11 → 78 → 190,符合你要的字典key排序要求sorted(df[key], key=lambda x: x[0]):针对每个key对应的列表,使用lambda表达式指定排序依据为子列表(元组)的第一个元素,实现列表内部的升序排列
如果需要提前生成完整的排序后字典(方便后续复用),也可以用字典推导式预处理:
# 生成按key升序、且每个值列表已排序的新字典 sorted_df = { key: sorted(value, key=lambda x: x[0]) for key, value in sorted(df.items(), key=lambda item: item[0]) } # 遍历预处理后的字典进行写入 for key in sorted_df: if key in hf: deliverable.write(bytes(f"{1} {bag_to_svmlight(sorted_df[key])}\n", 'utf-8')) else: deliverable.write(bytes(f"{0} {bag_to_svmlight(sorted_df[key])}\n", 'utf-8'))
两种方式都能达成你的需求,前者在循环内即时处理节省内存,后者提前预处理方便后续多次使用,可根据实际场景选择。
内容的提问来源于stack exchange,提问作者Kin_99
相关产品推荐
相关产品推荐

