如何使用复合键对python字典进行排序和子集划分?

2024-06-28 20:20:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python字典,里面有复合键(Pri_key,Sec_key)和value:

(123, 456): 45
(123, 457): 90
(124, 234): 70
(125, 87): 3
(125, 103): 56
(125, 897): 34

如何按降序对每个“主键”的值进行排序,并相应地列出相应的“辅键”? 预期结果:

^{pr2}$

Tags: key字典排序valuesecpri主键pr2
3条回答

这里的关键是原样的。之后,您可以在主键上groupby。要构造排序,可以用键关闭(<primary-key>, -<value>)的元组(负数是按降序对具有相同主键的值进行排序):

from itertools import groupby
from operator import itemgetter
sorted_keys = sorted(original_dict, key=lambda key: (key[0], -original_dict[key]))
for primary_key, key_group in groupby(sorted_keys, key=itemgetter(0)):
    print(primary_key, [key[1] for key in key_group])

当然,如果您可以打印键,那么您可以使用它来构造字典(或任何其他数据结构),使用结果:-)。在

下面是我的终端演示:

^{pr2}$

我们需要迭代这些键,然后用复合键的第二个值构建另一个字典,作为这个新字典指向的列表的一部分。然后我们对新字典的值进行排序。观察。在

假设您的原始字典名为d。在

k = {} # Our new dictionary
for key in d.keys():
    (Pri_key, Sec_key) = key
    try:
        k[Pri_key].append(Sec_key)
    except KeyError:
        k[Pri_key] = [Sec_key] # Make a new list if the new key doesn't exist

# Make a list of sorted keys
keys = [key for key in d.keys()]
keys.sort()
for key in keys:
    list = d[key]
    list.sort()
    print(key + ':' + list)

给你。在

一个衬垫:

sorted((k,sorted(v)) for k,v in functools.reduce(lambda d,k: (d[0],d[0].setdefault(k[0],[]).append(k[1])),d.keys(),({},None))[0].items())

更清晰:

^{pr2}$

相关问题 更多 >