Понимание, чтобы найти мин в диктовке

1

Мне любопытно что-то:

У меня есть дикт, например, с автомобилем в качестве ключа и значение его скорости. Теперь я хочу найти ключ с наименьшим значением.

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 выше.

Большое спасибо!

  • 2
    Вы не правы, I know this code works with O(1) . list(car_dict.values()) требует итерации по всем значениям и поэтому равен O (n).
  • 1
    Первый блок действительно работает в O(1) ?
Показать ещё 1 комментарий
Теги:
list
dictionary
list-comprehension

6 ответов

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
    Спасибо @jpp !! действительно всеобъемлющий!
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
0

Это позволит сравнить значение ключа с минимальным значением

worst = [i for i in car_dict if car_dict[i] == min(car_dict.values())]
  • 0
    Вам нужно заменить d на car_dict
  • 0
    @Bazingaa Я использую d в моем vim, скопировал как, заменил
Показать ещё 5 комментариев
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)
0

Как насчет этого:

car_dict = {'mercedes': 200, 'fiat': 100, 'porsche': 300, 'rocketcar': 600}
min_car = {}
for car in car_dict:
    if not min_car or car_dict[car] < min_car['speed']:
        min_car['name'] = car
        min_car['speed'] = car_dict[car]
print(min_car)
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'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню