基于元组列表对元组列表进行排序 - Python
问题描述:
我想根据另一个元组列表对列表中的键进行排序。基于元组列表对元组列表进行排序 - Python
说我有以下几点:
list1 = [(5, 'something'),(2,'bobby'),(9,'suzy'),(6,'crab')]
list2 = [('something','othervalues'),('suzy','stuff'),('bobby','otherthings')]
而从这个我会收到列表1中的每个元组的第一个元素在输出soring。
sorted = [('suzy','stuff'),('something','othervalues'),('bobby','otherthings') ]
因此,本质上它执行一个交集,然后通过list1的元组中的第一个元素对剩余值进行排序。
我不知道该怎么做,所以任何帮助都会很棒。
答
只是做描述说什么,不大不小的通过在该列表中的一个关键基础元组的另一份名单上的元组的列表:
rank = {key:rank for rank, key in list1}
print(sorted(list2, key=lambda t: rank.get(t[0]), reverse=True))
答
首先创建一个字典从list1
:
>>> order = dict(reversed(t) for t in list1)
这将创建一个name -> number
映射。
然后你可以使用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)
值得一读:Sorting Mini-HOW TO
答
这会很容易被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')]
N.B:sorted
是一个内置的Python功能和变量名一个不错的选择。