思路:
1.对嵌套字典转换结构。
2.最内层以组为键:{“a”:[],“b”:[]},即对"a","b"排序。外面多少层都可以,递归到组这一层即可。
3.再对组里面的数组,按某个键或者值排序。
def sort_dict(in_result,limit):
# 最外层的dict几个键,表示分组排序
position = [i for i in in_result.keys()]
for pos in position:
# 在每个组内,按某个字段排序
sort_dict = sorted(in_result[pos], key = lambda x:x["b"], reverse = False)
# 获取第limit个小值,比如前3个最小值,包括重复值
min_b = sort_dict[0]["b"]
# 记录非重复个数
conter = 0
# 记录重复个数
index = 0
# 重复的放进同一个列表中,即filter_result 子列表中
filter_result = [[] for i in range(limit)]
for doc in sort_dict:
if not doc["b"] == min_b:
min_b = doc["b"]
conter +=1
if conter>=limit:
break
# 存储第i小值
filter_result[conter].append(sort_dict[index])
index +=1
io_result.update({pos:filter_result})
"""
io_result = {'in': [[{'a': 1, 'b': 2}, {'a': 1.1, 'b': 2}], [{'a': 1, 'b': 3}, {'a': 1, 'b': 3}]],
'out': [[{'a': 1, 'b': 2.1}], [{'a': 1.1, 'b': 3.1}, {'a': 1, 'b': 3.1}]]}
"""
# 转换结果,方便写入excel
result_list = []
for i in range(limit):
for pos in position:
if len(io_result[pos][i])>0:
result_list.extend(io_result[pos][i])
else:
result_list.append(io_result[pos][i])
return result_list
if __name__ == "__main__":
in_result = {"in":[{"a":1,"b":2},{"a":1.1,"b":2},{"a":1,"b":3},{"a":1,"b":3},{"a":1,"b":4}],
"out":[{"a":1,"b":2.1},{"a":1.1,"b":3.1},{"a":1,"b":3.1},{"a":1,"b":4.1},{"a":1,"b":5.1}]}
result = sort_dict(in_result,2)
print(result)
"""
[{'a': 1, 'b': 2}, {'a': 1.1, 'b': 2}, {'a': 1, 'b': 2.1}, {'a': 1, 'b': 3},
{'a': 1, 'b': 3}, {'a': 1.1, 'b': 3.1}, {'a': 1, 'b': 3.1}]
"""