【问题标题】:Get key-value pair based on minimum value in list根据列表中的最小值获取键值对
【发布时间】:2020-06-26 01:12:28
【问题描述】:

我试过用谷歌搜索这个,但找不到与此类似情况的答案。我有一本格式如下的字典:

    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]}        

注意最小值总是在列表的末尾,列表中的其他元素与键相关。

【问题讨论】:

  • 如果sub_dict 的最后一个值相同,则可能有多个对?

标签: python python-3.x list min


【解决方案1】:

内置min函数有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]}

【讨论】:

  • key=lambda x: x[-1] 的一个有趣替代方法是使用 key=itemgetter(-1).. itemgetter()operator 模块中。我喜欢你提前考虑可能具有相同最小值的项目
【解决方案2】:

您可以使用特殊的排序函数进行排序,该函数将从字典中获取预期的键值对作为第一个元素:

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] 对应于值。

排序为我们提供了按列表的最后一个元素从字典中排序的 pairs 键和值。然后取第一个并重新创建字典就足够了。

警告:如果原始列表中有更多具有最小值的值,那么您将只能获得该值的一个任意项。

在这种情况下,您可以从结果列表中选择所有项目,而不是只选择第一个值:

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

【讨论】:

  • 如果 dict 中有更多具有相同 min_value 的项目,这将不起作用。
  • 这是一个特例,OP没有提到。但我也为这个问题添加了解决方案。
【解决方案3】:
>>> 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]

【讨论】:

    【解决方案4】:

    你可以这样做:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-25
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      相关资源
      最近更新 更多