理解如何在字典中找到最小值

时间:2018-09-23 16:50:48

标签: python list dictionary list-comprehension

我对一件事情很好奇:

我有一个字典,例如以汽车为钥匙,并给出有关其速度的值。现在,我想找到具有最低值的键。

car_dict = {'mercedes': 200, 'fiat': 100, 'porsche': 300, 'rocketcar': 600}

我知道这段代码适用于O(1)

car_value = list(car_dict.values())
car_key = list(car_dict.keys())
min_stats = min(car_value)
print(car_key[car_value.index(min_stats)]) 

这也是O(n)

keys = []
values = []
for name, value in car_dict.items():
    keys.append(name)
    values.append(value)

min_value = min(values)
print(keys[values.index(min_value)])

我目前正在尝试更好地理解理解,因此,我的问题是列表理解是否可以解决这个问题。

我在想这样的事情

worst = {name for name, stats in car_dict if min(stats)}

但是,我想我仍然误解了if部分中的某些内容。

如果我对上述Big O复杂性的看法有误,请纠正我。

非常感谢!

6 个答案:

答案 0 :(得分:2)

  

我知道这段代码适用于O(1):

     

car_value = list(car_dict.values())

这是不正确的。要从视图形成列表,您必须遍历所有值。此操作的时间复杂度为O(n)。

通常,不需要创建键和值的列表。避免执行这些操作,因为它们很昂贵。

请注意,min可以直接在dict.items(这是键值对的视图)上工作。仅当您只有一辆具有最小值的汽车时才建议这样做:

car, value = min(car_dict.items(), key=lambda x: x[1])  # (fiat, 100)

由于字典不被认为是有序的(除非您使用的是Python 3.7),对于重复的最小值,将无法确定结果。在这种情况下,您可以计算最小值,然后使用列表推导:

min_val = min(car_dict.values())
min_cars = [car for car, value in car_dict.items() if value == min_val]  # ['fiat']

您还可以将next与生成器表达式一起使用来提取第一辆这样的汽车:

min_car_first = next(car for car, value in car_dict.items() if value == min_val)

当然,如果是一辆具有最小值的汽车,其结果将与第一个解决方案min(car_dict.items(), ...)相同。

答案 1 :(得分:0)

这可以将密钥的值与值的最小值进行比较

worst = [i for i in car_dict if car_dict[i] == min(car_dict.values())]

答案 2 :(得分:0)

您无法在比线性时间内更快地解决此问题,但可以在线性时间内一遍解决

min_speed = None
that_car = None
for car,speed in car_dict.items():
    if min_speed is None or speed < min_speed:
        that_car, min_speed = car, speed
that_car
#'fiat'

答案 3 :(得分:0)

好吧,我不确定该程序的运行时间是多少,但是您可以尝试一下它对我有用:

>>> d = {'mercedes': 200, 'fiat': 100, 'porsche': 300, 'rocketcar': 600}
>>> d.items()
[('mercedes', 200), ('fiat', 100), ('porsche', 300) , ('rocketcar',600)]
>>> # find the minimum by comparing the second element of each tuple
>>> min(d.items(), key=lambda x: x[1]) 
('fiat', 100)

答案 4 :(得分:0)

如何?

double

答案 5 :(得分:0)

问题是您不应该通过理解来解决此问题,因为您不能在理解中进行赋值。遍历字典,一次即可找到最小值:

car_iterator = iter(car_dict.items())
slowest_car, min_speed = next(car_list)
for car, speed in car_iterator:
    if speed < min_speed:
        slowest_car = car