Сортировка списка словарей, который содержит список в качестве значения

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

>>> lod
[{'A': [颼', 餠', 馄', 600]}, {'B': [񟝘', 񟭀', 񟼨', 6000]}, {'C': [Ƈ', ƈ', Ɖ', 6]}]

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

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

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

[{'A': [颼', 餠', 馄', 600]}, {'B': [񟝘', 񟭀', 񟼨', 6000]}, {'C': [Ƈ', ƈ', Ɖ', 6]}]

Как вы думаете, в чем проблема?

Благодарю.

Всего 3 ответа


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

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

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

sorted(lod, key=lambda elem: next(iter(elem.values()))[-1])

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

>>> l = [{'A': [颼', 餠', 馄', 600]}, {'B': [񟝘', 񟭀', 񟼨', 6000]}, {'C': [Ƈ', ƈ', Ɖ', 6]}]
>>> 
>>> criterion = lambda dict_: tuple(dict_.values())[0][-1]
>>> sorted(l, key=criterion)
>>> 
[{'C': [Ƈ', ƈ', Ɖ', 6]},
 {'A': [颼', 餠', 馄', 600]},
 {'B': [񟝘', 񟭀', 񟼨', 6000]}]    

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


sorted(lod, key=lambda d: list(d.values())[0][-1])

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


Есть идеи?

10000