Сотрировка списка списков по второму элементу
Есть список:
[['A', 2], ['B', 3], ['C', 4], ['D', 3], ['E', 2], ['F', 1], ['G', 1]]
Нужно сделать сортировку, чтобы первый элемент (в отсортированном списке) был с максимальным вторым элементом исходного списка, и так далее по убыванию.
Например, в списке, что я задал выше, первый элемент будет ['C', 4] , второй - ['B', 3] и так далее...
Ответы (3 шт):
Используйте функцию sort, чтобы отсортировать текущий список. Либо функцию sorted, для получения нового отсортированного списка.
Для сортировки используется атрибут key, а чтобы порядок был по убыванию reverse=True.
Кст, key=lambda x: (x[1], x[0]) делает сортировку по двум значениям -- сначала по x[1], а после для одинаковых значений x[1] сортирует по x[0]
Пример с sort:
items = [['A', 2], ['B', 3], ['C', 4], ['D', 3], ['E', 2], ['F', 1], ['G', 1]]
items.sort(key=lambda x: x[1], reverse=True)
print(items)
# [['C', 4], ['B', 3], ['D', 3], ['A', 2], ['E', 2], ['F', 1], ['G', 1]]
items.sort(key=lambda x: (x[1], x[0]), reverse=True)
print(items)
# [['C', 4], ['D', 3], ['B', 3], ['E', 2], ['A', 2], ['G', 1], ['F', 1]]
воспользуйтесь параметрами key и reverse функции sorted():
res = sorted(data, reverse=True, key=lambda x: x[1])
результат:
In [393]: res
Out[393]: [['C', 4], ['B', 3], ['D', 3], ['A', 2], ['E', 2], ['F', 1], ['G', 1]]
Практические методы уже есть, что ж пусть будет учебный.
def quicksort(l):
less = []
equal = []
greater = []
if len(l) > 1:
p = l[0]
for i in l:
if i[1] < p[1]:
less.append(i)
elif i[1] == p[1]:
equal.append(i)
elif i[1] > p[1]:
greater.append(i)
return quicksort(less) + equal + quicksort(greater)
else:
return l
array = [['A', 2], ['B', 3], ['C', 4], ['D', 3], ['E', 2], ['F', 1], ['G', 1]]
print(quicksort(array))
Сортировка по возрастанию. А по убыванию можно например использовать [::-1] или reversed. А можно модифицировать алгоритм:
def quicksort(l):
less = []
equal = []
greater = []
if len(l) > 1:
p = l[0]
for i in l:
if i[1] < p[1]:
less.append(i)
elif i[1] == p[1]:
equal.append(i)
elif i[1] > p[1]:
greater.append(i)
return quicksort(greater) + equal + quicksort(less)
else:
return l
array = [['A', 2], ['B', 3], ['C', 4], ['D', 3], ['E', 2], ['F', 1], ['G', 1]]
print(quicksort(array))
В любом случае на практике не пишете так. Ну а если это что-то учебное — тогда это неплохо. Удачи!