根据值中的列表的值对字典进行排序

时间:2019-01-25 09:32:20

标签: python list sorting dictionary

我有字典

my_dict = {'name':['a','b','c','d','e'],'c1':[0,0,1,2,0],'c2':[3,0,2,1,2],'c3':[1,2,3,4,5]}

我想根据c1c2的值对字典进行排序。我怎样才能做到这一点? 即对dict进行排序的优先级是使用C1,但是如果C1当时具有c1 [0]和c1 [1]之类的相同值,则会基于C2数据来缩短数据。

我在下面尝试过但出现错误:

c1_list = count_dict.get('c1')
c1_list.sort(reverse=True)

index_map = {v: i for i, v in enumerate(c1_list)}
print sorted(my_dict.items(), key=lambda pair: index_map[pair[0]])

预期输出:

{'name':['d','c','a','e','b'],'c1':[2,1,0,0,0],'c2':[1,2,3,2,0],'c3':[4,3,1,5,2]}

2 个答案:

答案 0 :(得分:1)

如果您要按特定的相反顺序对所有值进行排序,这里的c2c1值可以一起zip(),并使用{{ 3}},以便按保存顺序对所有值进行排序。

Python 3

key

输出:

my_dict = my_dict = {'name':['a','b','c','d','e'],'c1':[0,0,1,2,0],'c2':[3,0,2,1,2],'c3':[1,2,3,4,5]}
sort_by = [my_dict['c1'], my_dict['c2']]

for k, v in my_dict.items():
    my_dict[k] = [i for *_, i in sorted(zip(*sort_by, v), key=lambda x: x[:-1], reverse=True)]

print(my_dict)

Python 2

{'name': ['d', 'c', 'a', 'e', 'b'], 'c1': [2, 1, 0, 0, 0], 'c2': [1, 2, 3, 2, 0], 'c3': [4, 3, 1, 5, 2]}

输出:

my_dict = my_dict = {'name':['a','b','c','d','e'],'c1':[0,0,1,2,0],'c2':[3,0,2,1,2],'c3':[1,2,3,4,5]}
sort_by = [my_dict['c1'], my_dict['c2']]

for k, v in my_dict.items():
    my_dict[k] = [i[0] for i in sorted(zip(v, *sort_by), key=lambda x: x[1:], reverse=True)]

print(my_dict)

答案 1 :(得分:0)

熊猫

通常我会为此使用numpy,但是由于它没有将字典转换为结构化数组的便捷构造函数,因此我建议使用pandas

import pandas as pd

my_dict = {'name':['a','b','c','d','e'],'c1':[0,0,1,2,0],'c2':[3,0,2,1,2],'c3':[1,2,3,4,5]}

df = pd.DataFrame(my_dict)
df_sorted = df.sort_values(by=['c1', 'c2'])[::-1]
sorted_dict = df_sorted.to_dict('list')

输出:

 {'name': ['d', 'c', 'a', 'e', 'b'], 'c1': [2, 1, 0, 0, 0], 'c2': [1, 2, 3, 2, 0], 'c3': [4, 3, 1, 5, 2]}