Объединение словаря с возможно повторяющимися ключами в другой словарь, содержащий самые большие значения

В общем случае вы хотите написать свою функцию извлечения ключей для сортировки; только в особых (хотя и важных) случаях бывает так, что вы можете просто повторно использовать существующее вызываемое для извлечения ключей для вас или просто подключить пару существующих («быстрым и грязным» способом с помощью lambda, поскольку нет встроенный способ выполнения композиции функций.

Если вам часто приходится выполнять эти два вида операций для извлечения ключей (получить элемент и вызвать метод для этого элемента), я предлагаю:

def combiner(itemkey, methodname, *a, **k):
  def keyextractor(container):
    item = container[itemkey]
    method = getattr(item, methodname)
    return method(*a, **k)
  return keyextractor

, поэтому listofdicts.sort(key=combiner('name', 'lower')) будет работать в вашем случае.

Обратите внимание, что в то время как чрезмерное обобщение имеет издержки, со вкусом и умеренным обобщением (оставляя ключ элемента, имя метода и аргументы метода, если таковые имеются , поскольку в этом случае определено время выполнения), как правило, имеет преимущества - одна общая функция, не более сложная, чем дюжина конкретных и специализированных (с экстрактором, методом вызова или и тем, и другим), будет проще в их коде) для поддержания (и, конечно же, намного проще повторного использования!).)

2
задан heltonbiker 18 January 2019 в 14:16
поделиться

1 ответ

Вы можете объединить словари в один поиск и затем преобразовать их обратно в словарь.

var result = dictionaries.SelectMany(dict => dict)
                         .ToLookup(pair => pair.Key, pair => pair.Value)
                         .ToDictionary(g => g.Key, g => g.Max());
0
ответ дан Marcin Topolewski 18 January 2019 в 14:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: