我在Python中有一个元组列表,我想根据元组的第二个值对它们进行排序(这是一个字符串,所以我想按字母顺序对它们进行排序)并交换元组的第一个值。例如,让我们说我们有一些列表:
lst = [(1, "z"), (2, "a"), (3, "b")]
我希望最终结果如下:
result = [(1, "a"), (2, "b"), (3, "z")]
这可能与内置方法有关,还是我必须编写自己的函数?
答案 0 :(得分:3)
使用旧的zip(*lst)
转置技巧将列表拆分为两个,然后将第二个列表排序并将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')]
答案 1 :(得分:2)
您可以使用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')]
答案 2 :(得分:1)
这是一个功能性解决方案:
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
。
答案 3 :(得分:0)
这不是一行,但如果你想要,你可以试试:
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)))