根据元组列表排序元组列表 - Python

3 投票
3 回答
887 浏览
提问于 2025-04-16 15:51

我想根据另一个元组列表中的某个关键字,对一个元组列表进行排序。

假设我有以下内容:

list1 = [(5, 'something'),(2,'bobby'),(9,'suzy'),(6,'crab')]
list2 = [('something','othervalues'),('suzy','stuff'),('bobby','otherthings')]

然后我希望得到的结果是根据list1中每个元组的第一个元素进行排序。

sorted = [('suzy','stuff'),('something','othervalues'),('bobby','otherthings') ]

所以基本上,它是先找出交集,然后根据list1中元组的第一个元素对剩下的值进行排序。

我不太确定该怎么做,所以任何帮助都非常感谢。

3 个回答

0

如果 list2 是一个 dict(字典),那就简单多了,像这样:

{'bobby': 'otherthings', 'something': 'othervalues', 'suzy': 'stuff'}

Python会自动帮你转换:

>>> dict2 = dict(list2)

然后你可以使用 list comprehension(列表推导式):

>>> [(k,dict2[k]) for _,k in sorted(list1, reverse=True) if k in dict2]
[('suzy', 'stuff'), ('something', 'othervalues'), ('bobby', 'otherthings')]

注意: sorted 是Python内置的一个函数,最好不要用它作为变量名。

3

首先,从 list1 创建一个字典:

>>> order = dict(reversed(t) for t in list1)

这样就形成了一个 名字 -> 数字 的对应关系。

接下来,你可以使用 sorted 方法(别把你的变量命名成这个)和一个 lambda 表达式作为 key

>>> sorted(list2, key=lambda x: order[x[0]], reverse=True)
[('suzy', 'stuff'), ('something', 'othervalues'), ('bobby', 'otherthings')]

或者,如果你想就地排序:

>>> list2.sort(key=lambda x: order[x[0]], reverse=True)

值得一读: 排序小指南

3

只需按照描述所说的做,按照另一个元组列表中的某个关键字,对一个元组列表进行排序:

rank = {key:rank for rank, key in list1}
print(sorted(list2, key=lambda t: rank.get(t[0]), reverse=True))

撰写回答