根据len(value)对字典进行排序,其中value是一个集合

时间:2019-06-21 15:03:31

标签: dictionary python-3.7

我知道有很多解决方案(How do I sort a dictionary by value?)来按值对字典进行排序。但是,其中大多数早于python 3.7对dictionary的更改。

我也知道Fastest way to sort a python 3.7+ dictionary,它似乎很接近我需要的答案。

我有一个很大的键字典,这些键是整数,值是一组字符串。

我想创建一个新字典,该字典按照每个值的长度排序。

字典:

dict1={
'12':{'sym1', 'sym2'},
'13':{'sym1', 'sym4', 'sym5', 'sym6'},
'14':{'sym1', 'sym3'},
'15':{'sym2'},
'16':{'sym2'},
'17':{'sym2'},
'18':{'sym3', 'sym89', 'sym34', 'sym5', 'sym88'}
}

新排序的字典:

>>sorted_dict1

{
'18':{'sym3', 'sym89', 'sym34', 'sym5', 'sym88'},
'13':{'sym1', 'sym4', 'sym5', 'sym6'},
'12':{'sym1', 'sym2'},
'14':{'sym1', 'sym3'},
'15':{'sym2'},
'16':{'sym2'},
'17':{'sym2'}
}

1 个答案:

答案 0 :(得分:0)

我认为这是一种非常慢的方法,但是可以这样:

  1. 创建一个具有相同键的字典,其值是键集的长度

from operator import itemgetter

dict1={
'12':{'sym1', 'sym2'},
'13':{'sym1', 'sym4', 'sym5', 'sym6'},
'14':{'sym1', 'sym3'},
'15':{'sym2'},
'16':{'sym2'},
'17':{'sym2'},
'18':{'sym3', 'sym89', 'sym34', 'sym5', 'sym88'}
}

dict1_len ={}
for k,v in dict1.items():
    dict1_len.update({k:len(v)})
  1. dict1_len按相反的值编号(降序排列)。
sorted_dict1_len = {k: v for k,v in sorted(dict1_len.items(), key=itemgetter(1), reverse=True)}
  1. 按照sorted_dict1_len给定的顺序使用键,将键和原始dict1给定的键值添加到sorted_dict1
sorted_dict1 = {}

for k in sorted_dict1_len.keys():
    print(k)
    sorted_dict1.update({k:dict1.get(k)})

编辑:改进的答案

from operator import itemgetter

dict1={
'12':{'sym1', 'sym2'},
'13':{'sym1', 'sym4', 'sym5', 'sym6'},
'14':{'sym1', 'sym3'},
'15':{'sym2'},
'16':{'sym2'},
'17':{'sym2'},
'18':{'sym3', 'sym89', 'sym34', 'sym5', 'sym88'}
}

def len_val(tup):
    return len(tup[1]) # length of the value i.e. elements in set

dict2 = sorted(dict1.items(), key=len_val, reverse=True)

print(dict2)

返回

[('18', {'sym88', 'sym5', 'sym89', 'sym3', 'sym34'}), ('13', {'sym1', 'sym5', 'sym6', 'sym4'}), ('12', {'sym1', 'sym2'}), ('14', {'sym3', 'sym1'}), ('15', {'sym2'}), ('16', {'sym2'}), ('17', {'sym2'})]