Добавление дополнительной логики в лямбда-функцию для получения минимального значения из словаря python

#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 ты прав, это отличная мысль. Спасибо.