В общем случае вы хотите написать свою функцию извлечения ключей для сортировки; только в особых (хотя и важных) случаях бывает так, что вы можете просто повторно использовать существующее вызываемое для извлечения ключей для вас или просто подключить пару существующих («быстрым и грязным» способом с помощью 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'))
будет работать в вашем случае.
Обратите внимание, что в то время как чрезмерное обобщение имеет издержки, со вкусом и умеренным обобщением (оставляя ключ элемента, имя метода и аргументы метода, если таковые имеются , поскольку в этом случае определено время выполнения), как правило, имеет преимущества - одна общая функция, не более сложная, чем дюжина конкретных и специализированных (с экстрактором, методом вызова или и тем, и другим), будет проще в их коде) для поддержания (и, конечно же, намного проще повторного использования!).)
Вы можете объединить словари в один поиск и затем преобразовать их обратно в словарь.
var result = dictionaries.SelectMany(dict => dict)
.ToLookup(pair => pair.Key, pair => pair.Value)
.ToDictionary(g => g.Key, g => g.Max());