繁体   English   中英

查找具有最高值的键值

[英]Finding key value with the highest value

我一直试图在嵌套字典中找到最大值的键。 我已经有了一个“有效”的解决方案,但我想知道如何让它变得更好。

给定一个嵌套字典,例如:

data={
  item_name_1: {
    city_name1 : {price : 100, date: 22/10}, 
    city_name2: {price :120, date: 22/10}
  },
  item_name_2: {
    city_name1 : {price : 105, date: 22/10},
    city_name2: {price :125, date: 22/10}
  }
}

我想找到item_name的最高值,以及该项目具有最高价值的城市。

我可以通过对字典中的所有item_names进行 for 循环来做到这一点:

for item_name in data:

然后使用最大 function 找到最高价格:

max_value = max(data[item_name][i]["min_price"] for i in data[item_name])

然后遍历城市的键和值,找到与我的值匹配的键:

for k, v in data[item_name].items():
    if data[item_name][k]["min_price"] == max_value:
        print(k)

我想知道一种更好的方法来做到这一点,因为它有很多问题,比如两次循环。

如果可能的话,我想知道这是否可以仅使用max function。 我看到了一些例子,并考虑做这样的事情:

max_value = max([(data[item_name][i]["min_price"],i) for i in data[item_name]], key=lambda x: data[item_name][i]["min_price"]])

尝试返回pricecity_name的元组,但没有任何帮助将不胜感激!

使用.items()max()key=参数。

item_highest = {}
for item_name, item_data in data.items():
    item_highest[item_name] = max(
        item_data.items(),
        key=lambda pair: pair[1]["price"],
    )

item_highest最终会将项目名称映射到元组(city_name, {...} ),其中{...}是城市的数据。

要最终获得您想要的元组,请进一步解包并重新打包:

item_highest = {}
for item_name, item_data in data.items():
    city_name, city_data = max(
        item_data.items(),
        key=lambda pair: pair[1]["price"],
    )
    item_highest[item_name] = (
        city_name,
        city_data["price"],
    )

使用dict comprehensions的另一种方法:

步骤1:

Z = {y:max(data[y].items(), key=lambda x:x[1]['price']) for y in data.keys()}

(对于每个数据键,选择其中价格最高的值)然后Z将是:

{'item_name_1': ('city_name2', {'price': 120, 'date': '22/10'}),
 'item_name_2': ('city_name2', {'price': 125, 'date': '22/10'})}

第2步:
现在你可以相应地重塑它:

{x:(y[0], y[1]['price']) for (x,y) in Z.items()}

OUTPUT:
这导致:

{'item_name_1': ('city_name2', 120), 'item_name_2': ('city_name2', 125)}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM