Как отсортировать список списков python как по значениям вложенного списка, так и с условием reverse = True только для первого значения вложенного списка? - PullRequest
1 голос
/ 16 февраля 2020

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

sample_list = [
  ['y', 4], 
  ['x', 2], 
  ['y', 1], 
  ['z', 2], 
  ['x', 5], 
  ['y', 2]]

sorted_list = sorted(sample_list, key=lambda nested: (nested[0], nested[1]), reverse=True)

Вывод:

[['z', 2], 
 ['y', 4], 
 ['y', 2], 
 ['y', 1], 
 ['x', 5], 
 ['x', 2]]

Ожидаемый результат:

[['z', 2], 
 ['y', 1], 
 ['y', 2], 
 ['y', 4], 
 ['x', 2], 
 ['x', 5]]

Ответы [ 2 ]

4 голосов
/ 16 февраля 2020

Вы можете использовать -nested[1] в своей лямбда-функции.

>>> sorted_list = sorted(sample_list, key=lambda nested: (nested[0],-nested[1]), reverse=True)
>>> print(*sorted_list,sep='\n')                                                                   
['z', 2]
['y', 1]
['y', 2]
['y', 4]
['x', 2]
['x', 5]
2 голосов
/ 16 февраля 2020

Ответ от "ab c" подходит для ваших примеров, но в целом, если вы хотите сортировать по нескольким ключам в разных порядках, вы не сможете отрицать некоторые из них (например, если значения - это все строки, а не числа). В таком случае вы можете сортировать несколько раз, чтобы контролировать порядок каждого ключа сортировки:

sorted_1 = sorted(sample_list, key=lambda nested: nested[1])
sorted_0_1 = sorted(sorted_1, key=lambda nested: nested[0], reverse=True)

Подобные вещи описаны в официальной документации: https://docs.python.org/3/howto/sorting.html

Это может занять больше времени, чем один sorted() вызов, но он будет работать с любыми сортируемыми данными, не только с теми, которые можно отменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...