#python #dictionary #lambda
#питон #словарь #лямбда
Вопрос:
У меня есть словарь со значениями, отображающими некоторый объект в целое число; например, {узел: 1, узел: 2}.
Я хочу получить ключ, соответствующий минимальному значению в этом словаре, что, как я знаю, я могу сделать с помощью:
min_key = min(my_dict, key=lambda k: my_dict[k])
Однако я также хотел бы добавить ограничение, что ключ не содержится в каком-либо другом наборе. Вот псевдокод, который я хотел бы, чтобы сработал:
min_key = min(my_dict, key=lambda k: my_dict[k] where k not in my_set)
Есть ли способ написать это в виде однострочной строки на python как часть лямбды, или мне теперь нужно явно просмотреть словарь и добавить логику в цикл, как это?
min_key, min_value = None, float('inf') for k,v in my_dict.items(): if v lt; min_value and k not in my_set: min_key = k return min_key
Комментарии:
1. Это неверный словарь, у вас не может быть дубликатов ключей.
2. Стандартный трюк состоит в том, чтобы возвращать
math.inf
значения, которые вы хотите игнорировать, принимая минимум. Аналогично используйте-math.inf
для нахождения максимума. Таким образом, ваш пример будетkey=lambda k: math.inf if k in my_set else my_dict[k]
Ответ №1:
Замените my_dict
на понимание словаря, которое возвращает отфильтрованный словарь.
min_key = min({k:v for k, v in my_dict.items() if k not in my_set}, key = lambda k: my_dict[k])
Комментарии:
1. Нет смысла создавать диктат со значениями, так как
min
он будет их игнорировать.2. Вы правы, нам просто нужен список ключей.
3. Поскольку вы опубликовали этот ответ, я не буду утруждать себя редактированием своего.
Ответ №2:
Просто возьмите минимум по отфильтрованным ключам вместо всех ключей:
min_key = min(my_dict.keys() - my_set, key=my_dict.get)
(Обратите внимание, что я также заменил вашу key
функцию, не нужно писать свою собственную.)
Ответ №3:
Это похоже на ответ @Barmar’а, но вы также можете использовать set.difference
между my_dict
и my_set
для фильтрации соответствующего словаря:
out = min(set(my_dict).difference(my_set), key = lambda k: my_dict[k])
Комментарии:
1. Вкладывать дополнительные усилия в ценности, которые
min
в любом случае будут игнорироваться, кажется расточительным.2. @KellyBundy ты прав, это отличная мысль. Спасибо.