我对一件事情很好奇:
我有一个字典,例如以汽车为钥匙,并给出有关其速度的值。现在,我想找到具有最低值的键。
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复杂性的看法有误,请纠正我。
非常感谢!
答案 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