我试过在谷歌上搜索这个,但找不到类似情况的答案。我有一本字典,格式如下:
my_dict={'key1': ['some_data', 'some_more_data',6.0], 'key2': ['junk', 'some_more_junk',7.0], 'key3': ['something_good', 'good',1.0]}
我该如何创建一个只包含列表末尾数字最小的键值对的子字典?换句话说,我希望我的输出是:
sub_dict={'key3': ['something_good','good',1.0]}
请注意,最小值将始终位于列表的末尾,列表中的其他元素与键相关。
Builtinmin
函数具有key
关键字参数
所以您不需要排序。
my_dict = {'key1': ['some_data', 'some_more_data', 6.0],
'key2': ['junk', 'some_more_junk', 7.0],
'key3': ['something_good', 'good', 1.0],
'key4': ['test', 'test', 1.0]}
min_value = min(my_dict.values(), key=lambda x: x[-1])[-1]
new_dict = {k: v for k, v in my_dict.items() if v[-1] == min_value}
print(new_dict)
输出:
{'key3': ['something_good', 'good', 1.0], 'key4': ['test', 'test', 1.0]}
您可以使用一个特殊的排序函数进行排序,该函数将从字典中获得所需的键值对作为第一个元素:
sort_res = sorted(my_dict.items(), key=lambda kv: kv[1][-1])
k,v = list(sort_res)[0]
sub_dict = {k:v}
lambda kv: kv[1][-1]
返回列表的最后一个元素,并使用它进行排序。由于它是在一对密钥和值上操作的,因此存在对应于该值的kv[1]
。
排序使我们能够按列表的最后一个元素对字典中的键和值进行排序。然后,只要取第一本,重新创建一本字典就足够了。
警告:如果原始列表中有更多具有最小值的值,那么您将只获得该值的一个任意项。
在这种情况下,您可以从结果列表中选择所有项目,而不是只选择第一个值:
lsort_res = list(sort_res)
res_dict = {}
minv = lsort_res[0][1][-1] # take the last element of the v list of the first k,v pair
for k,v in lsort_res:
if v[-1] == minv:
res_dict[k] = v
>>> min_value = sorted(my_dict.values(), key=lambda x: x[-1])[0][-1]
>>> {key: value for key, value in my_dict.items() if value[-1] == min_value}
{'key3': ['something_good', 'good', 1.0]}
首先获取min_value
,然后过滤字典,使其获得与min_value
匹配的所有键值对。
这将得到所有这样的键值对,其中最后一个值是1.0
。
您也可以使用min
直接获得最小值:
min_value = min(my_dict.values(), key=lambda x: x[-1])[-1]
您可以这样做:
sub_dict={}
smallest = 999999
key=''
for k,v in my_dict.items():
if v[-1] < smallest:
smallest = v[-1]
key = k
sub_dict[key] = my_dict[key]