#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, который позволяет выполнять пользовательскую сортировку.
Например, вы можете проверить, является ли текущий элемент также списком, и если да, отсортируйте его по номеру. В противном случае, пусть это будет там, где оно есть.