У меня есть метод, который группирует список dict по ключу. Чтобы сделать это, я обнаружил здесь , что мне нужно использовать функцию groupby
, но перед тем, как сортировать список. Вот мой метод прямо сейчас:
def group_list_by_key(data, key):
data.sort(key=lambda x: x[key])
result = []
for k, v in groupby(data, key=lambda x: x[key]):
result.append(list(v))
return result
Этот фрагмент кода работает, только если каждый ключ определен во всех диктовках, а значения имеют одинаковый тип. Однако, где я использую этот метод, я не знаю, везде ли определены ключи и имеют ли они один и тот же тип. В Python 2.x я знаю, что существует функция sorted
с параметром cmp
, которая может выполнять пользовательскую сортировку, но из Python 3.x это больше невозможно. Есть ли способ сделать заказную сортировку? Я думаю об использовании классической сортировки по <
и сортировке по typename.
К настоящему времени я подумал об использовании функции get и приведении к строке в виде, подобном
data.sort(key=lambda x: str(x.get(key)))
...
for k, v in groupby(data, key=lambda x: x.get(key)):
Преодолевает только строковое, числовое и None-содержимое, но не универсальный объект, и легко ломается, если, например, я выполню
a = [{'b': 0, 'c': 1}, {'b': '0'}, {'b': 0, 'c': 2}, {'b': 1}, {'c': 3}]
group_list_by_key(a, 'b')
Выход
[[{'b': 0, 'c': 1}], [{'b': '0'}], [{'b': 0, 'c': 2}], [{'b': 1}], [{'c': 3}]]
вместо того, что я ожидаю (порядок списков не проблема)
[[{'b': 0, 'c': 1}, {'b': 0, 'c': 2}], [{'b': '0'}], [{'b': 1}], [{'c': 3}]]