我有字典
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]}
我想根据c1
和c2
的值对字典进行排序。我怎样才能做到这一点?
即对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]}
答案 0 :(得分:1)
如果您要按特定的相反顺序对所有值进行排序,这里的c2
和c1
值可以一起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]}