[英]Python: sort lists in dictonary of lists, where one list is a key to sorting
让我说我有一个dictonary
d = {
u'a': [1, 4, 6, 7],
u'b': [9, 9, 9, 8],
u'c': ['g', 'a', 'b', '9'],
u'd': [5, 1, 10, 2],
}
我想同时对该字典中的列表进行排序,其中排序的关键是列表中的值d[u'd']
让我们说,排序的结果将是
new_d = {
u'a': [4, 7, 1, 6],
u'b': [9, 8, 9, 9],
u'c': ['a', '9', 'g', 'b'],
u'd': [1, 2, 5, 10] <- we have sorted by that list
}
from operator import itemgetter
srt_key = [i for i, e in sorted(enumerate(d["d"]), key=itemgetter(1))]
new_d = {}
for k,v in d.items():
new_d[k] = list(itemgetter(*srt_key)(v))
print(new_d)
{'c': ['a', '9', 'g', 'b'], 'a': [4, 7, 1, 6], 'b': [9, 8, 9, 9], 'd': [1, 2, 5, 10]}
或者使用dict comp:
new_d = {k: list(itemgetter(*srt_key)(v)) for k,v in d.items()}
print(new_d)
首先,在dict中单独的键和值
>>> keys, values = zip(*d.items())
现在, zip
值,将键列表添加为第一列
>>> zip(d[u"d"], *values)
[(5, 1, 'g', 9, 5), (1, 4, 'a', 9, 1), (10, 6, 'b', 9, 10), (2, 7, '9', 8, 2)]
按第一列(键列表)对值排序
>>> sorted(_)
[(1, 4, 'a', 9, 1), (2, 7, '9', 8, 2), (5, 1, 'g', 9, 5), (10, 6, 'b', 9, 10)]
然后将排序结果zip
并剥离键列
>>> zip(*_)[1:]
[(4, 7, 1, 6), ('a', '9', 'g', 'b'), (9, 8, 9, 9), (1, 2, 5, 10)]
用键重新zip
以重建字典。
>>> dict(zip(keys, _))
{u'a': (4, 7, 1, 6),
u'b': (9, 8, 9, 9),
u'c': ('a', '9', 'g', 'b'),
u'd': (1, 2, 5, 10)}
一切都放在一起:
keys, values = zip(*d.items())
new_d = dict(zip(keys, zip(*sorted(zip(d[u"d"], *values)))[1:]))
您可以像这样构建new_d
:
In [9]: new_d = {}
In [10]: for k in d.keys():
new_d[k] = [x for (y,x) in sorted(zip(d[u'd'],d[k]), key=lambda pair: pair[0])]
....:
In [11]: new_d
Out[11]:
{u'a': [4, 7, 1, 6],
u'b': [9, 8, 9, 9],
u'c': ['a', '9', 'g', 'b'],
u'd': [1, 2, 5, 10]}
此方法将每个列表中的项与管理排序顺序的列表配对,并通过后者对列表进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.