Сортировка и замена значений кортежей / кортежей в Python
У меня есть список кортежей в Python, и я хотел бы отсортировать их по второму значению кортежа (который является строкой, поэтому я хотел бы отсортировать их в алфавитном порядке) и поменять местами первые значения кортежей. Например, допустим, у нас есть список:
lst = [(1, "z"), (2, "a"), (3, "b")]
Я хотел бы, чтобы конечный результат был таким:
result = [(1, "a"), (2, "b"), (3, "z")]
Это возможно сделать с помощью встроенного метода, или я должен написать свою собственную функцию?
4 ответа
Разделите список на два со старым zip(*lst)
перенести трюк, затем отсортировать 2-й список и zip
они снова вместе:
lst = [(1, "z"), (2, "a"), (3, "b")]
lst1, lst2 = zip(*lst)
result = list(zip(lst1, sorted(lst2)))
# lst1: (1, 2, 3)
# lst2: ('z', 'a', 'b')
# result: [(1, 'a'), (2, 'b'), (3, 'z')]
Ты можешь использовать zip
:
lst = [(1, "z"), (2, "a"), (3, "b")]
sort_l = [(a, c) for [a,_ ], c in zip(lst, sorted(b for _, b in lst))]
Выход:
[(1, 'a'), (2, 'b'), (3, 'z')]
Вот функциональное решение:
from operator import itemgetter
lst = [(1, "z"), (2, "a"), (3, "b")]
res = list(zip(map(itemgetter(0), lst), sorted(map(itemgetter(1), lst))))
print(res)
[(1, 'a'), (2, 'b'), (3, 'z')]
Обратите внимание, что вы не должны именовать переменные после встроенных модулей: используйте lst
вместо list
,
Это не одна строка, но если вы хотите, вы можете попробовать:
lst = [(1, "z"), (2, "a"), (3, "b")]
first=[]
second=[]
for i,j in lst:
first.append(i)
second.append(j)
print(list(zip(sorted(second),first)))