根据元组列表排序元组列表 - Python
我想根据另一个元组列表中的某个关键字,对一个元组列表进行排序。
假设我有以下内容:
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))