Сортировка списка в списке по номерам

#python

Вопрос:

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

 ['Soul String', 'RARE',  [900000, '3b4c1f7f9ae447a983817c303b62375a', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [700000, '01b6b2ec8a5c4a4e934149a33e99802e', 'Soul String'], [700000, 'be1aa3a0700b403898a2e6e05d77e63d', 'Soul String']]
 

судя по цене, так выглядит этот список

 ['Soul String', 'RARE', [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [700000, '01b6b2ec8a5c4a4e934149a33e99802e', 'Soul String'], [700000, 'be1aa3a0700b403898a2e6e05d77e63d', 'Soul String']], [900000, '3b4c1f7f9ae447a983817c303b62375a', 'Soul String']
 

Но я понятия не имею, как мне это сделать, может быть, кто-нибудь из вас, ребята, сможет мне помочь

Комментарии:

1. хорошо , сначала вы можете уточнить, что это за хэш и целое число, если вы укажете дополнительную информацию, мы сможем предоставить вам точный ответ.

2. Ваш ожидаемый список не является отсортированным списком, значения 4*10^6, 9*10^5 и 7*10^5

Ответ №1:

Если вам нужно, чтобы ваш список печатался в обратном порядке (от максимального значения к минимальному), вам необходимо указать максимально возможное значение для элементов, не входящих в список (то есть math.inf ).

Затем вы можете получить свой список sorted и в reverse , если вы укажете, как key определена пользовательская функция.

 >>> import math
>>> def sort_list(element):
...    if isinstance(element, (list, tuple)): 
...       return element[0]
...    else: 
...       return math.inf

>>> sorted(l, key=sort_list, reverse=True)
['Soul String',
 'RARE',
 [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'],
 [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'],
 [900000, '3b4c1f7f9ae447a983817c303b62375a', 'Soul String'],
 [700000, '01b6b2ec8a5c4a4e934149a33e99802e', 'Soul String'],
 [700000, 'be1aa3a0700b403898a2e6e05d77e63d', 'Soul String']]
 

Ответ №2:

Вы можете выполнить пользовательскую сортировку с помощью лямбды:

 l = ['Soul String', 'RARE',  [900000, '3b4c1f7f9ae447a983817c303b62375a', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [700000, '01b6b2ec8a5c4a4e934149a33e99802e', 'Soul String'], [700000, 'be1aa3a0700b403898a2e6e05d77e63d', 'Soul String']]

sorted(l, key=lambda x: x[0] if type(x[0])==int else 999999999, reverse=True)

['Soul String',
 'RARE',
 [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'],
 [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'],
 [900000, '3b4c1f7f9ae447a983817c303b62375a', 'Soul String'],
 [700000, '01b6b2ec8a5c4a4e934149a33e99802e', 'Soul String'],
 [700000, 'be1aa3a0700b403898a2e6e05d77e63d', 'Soul String']]
 

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

 d = {'Soul String': {'name': 'Soul String', 'rarity': 'RARE',  'stock': [[900000, '3b4c1f7f9ae447a983817c303b62375a', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [4000000, 'feacbc053bb240be954a4b17c14077d2', 'Soul String'], [700000, '01b6b2ec8a5c4a4e934149a33e99802e', 'Soul String'], [700000, 'be1aa3a0700b403898a2e6e05d77e63d', 'Soul String']]}}

d['Soul String']['stock'] = sorted(d['Soul String']['stock'], key = lambda x: x[0], reverse = True)
 

Ответ №3:

Существует метод list.sort, который позволяет выполнять пользовательскую сортировку.

Например, вы можете проверить, является ли текущий элемент также списком, и если да, отсортируйте его по номеру. В противном случае, пусть это будет там, где оно есть.