Сортировка списка словарей, который содержит список в качестве значения - PullRequest
0 голосов
/ 22 октября 2018

У меня есть этот список словарей, у которых в качестве значения указан список:

>>> lod
[{'A': ['100', '200', '300', 600]}, {'B': ['1000', '2000', '3000', 6000]}, {'C': ['1', '2', '3', 6]}]

, и в основном мне нужно отсортировать этот список по последнему элементу в списке каждого словаря.

Поэтому я использовал sorted (), но он не сработал, как ожидалось:

>>> sorted(lod, key= lambda x: lod[0][''.join(list(lod[0].keys()))][3])

[{'A': ['100', '200', '300', 600]}, {'B': ['1000', '2000', '3000', 6000]}, {'C': ['1', '2', '3', 6]}]

В чем, по-вашему, проблема здесь?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

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

>>> l = [{'A': ['100', '200', '300', 600]}, {'B': ['1000', '2000', '3000', 6000]}, {'C': ['1', '2', '3', 6]}]
>>> 
>>> criterion = lambda dict_: tuple(dict_.values())[0][-1]
>>> sorted(l, key=criterion)
>>> 
[{'C': ['1', '2', '3', 6]},
 {'A': ['100', '200', '300', 600]},
 {'B': ['1000', '2000', '3000', 6000]}]    

tuple(dict_.values()) создает одноэлементный кортеж значений для каждого внутреннего диктанта, [0] получает список из этого кортежа, а [-1] получает последний элемент этого списка в качестве критерия сортировки.

0 голосов
/ 22 октября 2018
sorted(lod, key=lambda d: list(d.values())[0][-1])

сделает это.Объяснение: list(d.values())[0] вернет единственное значение из вашего словаря, [-1] вернет последний его элемент (значение int, используемое для сортировки)

0 голосов
/ 22 октября 2018

Проблема в том, что это не так, как работает параметр key.Это должна быть функция, которая используется в алгоритме сортировки следующим образом:

if key(a) < key(b):
    # sort this way

Итак, она должна вернуть значение, которое вы хотите сравнить:

sorted(lod, key=lambda elem: next(iter(elem.values()))[-1])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...