根据一个键的值对字典的其他键进行排序

时间:2018-08-11 18:01:02

标签: python python-3.x

我有一本P医务词典。字典的每个键内部都有一个列表。我想根据一个列表对另一个列表进行排序。例如:

我有两个列表specialitycount,它们是字典P的一部分。两个列表的长度相同。

speciality = s('Cardiology' , 'Nephrology', 'ENT', 'Oncology').     
count = c(2, 7, 9, 1).

P = {'Speciliaty': speciality, 'Count': count}

比方说,我已经按照降序对列表“计数”进行了排序。列表Speciality的排序方式也应相同,以使Speciality 'Count'项目匹配不会受到影响。

count = c(9, 7, 2, 1).  
speciality = s('ENT', 'Nephrology', 'Cardiology', 'Oncology').

任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

zipsorted一起使用,并将reverse=True设置为反向排序:

speciality = ['Cardiology' , 'Nephrology', 'ENT', 'Oncology']
count = [2, 7, 9, 1]

count, speciality = zip(*[[x, y] for x, y in sorted(zip(count, speciality), reverse=True)])
P = {'Speciliaty': speciality, 'Count': count}

print(P)
# {'Speciliaty': ('ENT', 'Nephrology', 'Cardiology', 'Oncology'), 'Count': (9, 7, 2, 1)}


仅供参考,python中的列表用方括号[]表示。

答案 1 :(得分:0)

您可以使用numpy.argsort

indices = np.argsort(count)
count = np.sort(count)
specialty = [specialty[i] for i in indices]

答案 2 :(得分:0)

您没有指定是否已经拥有字典P或是否从代码列表中构建字典。对于后一种情况,可接受的答案是一种解决方法。但是通常,如果您的字典中包含许多键,值对,并且您希望根据特定的键值对对它们进行排序,那么更干净的解决方案是获取一个单独的位置列表,然后使用该列表对其他键进行排序值对。下面的例子

In [12]: P
Out[12]: 
{'Count': [2, 7, 9, 1],
 'Names': ['Obi', 'Luke', 'Anakin', 'Yoda'],
 'Speciliaty': ['Cardiology', 'Nephrology', 'ENT', 'Oncology']}

In [13]: pos = [ P['Count'].index(elem) for elem in sorted(P['Count'], reverse = True) ]

In [14]: pos
Out[14]: [2, 1, 0, 3]

In [15]: for k in P:                   
    P[k] = [P[k][elem] for elem in pos]
   ....:     

In [16]: P
Out[16]: 
{'Count': [9, 7, 2, 1],
 'Names': ['Anakin', 'Luke', 'Obi', 'Yoda'],
 'Speciliaty': ['ENT', 'Nephrology', 'Cardiology', 'Oncology']}