[英]Sort list of tuples based on another list
我有一个元组列表,例如。
l1 = [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'a', 'z'), (4, 'c', 'xyz')]
我还有一份清单
l2 = ['a', 'b', 'c']
我想根据l2
存在的顺序对每个元组的第二个值对l1
进行排序。 最后的结果应该是
l1 = [(1, 'a', 'x'), (3, 'a', 'z'), (2, 'b', 'y'), (4, 'c', 'xyz')]
如您所见,第二个值为a
的元组首先出现,然后是第二个值为b
元组,最后是具有c
元组。
我写了以下内容:
l = []
for i in l2:
for j in l1:
if i == j(1):
l.append(j)
这是非常直接的。 但我想知道是否有任何 pythonic 方法来完成这件事?
您可以使用sorted
与适当的key
功能:
l1 = [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'a', 'z'), (4, 'c', 'xyz')]
l2 = ['a', 'b', 'c']
d2 = {v: i for i, v in enumerate(l2)} # map elements to indexes
# {'a': 0, 'b': 1, 'c': 2}
sorted(l1, key=lambda x: d2[x[1]])
# [(1, 'a', 'x'), (3, 'a', 'z'), (2, 'b', 'y'), (4, 'c', 'xyz')]
您可以创建一个dict
,使用该值作为键和enumerate(l2)
给出的索引对其进行排序:
l1 = [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'a', 'z'), (4, 'c', 'xyz')]
l2 = ['a', 'b', 'c']
sorting ={key:idx for idx,key in enumerate(l2)}
l3 = sorted(l1, key = lambda x: sorting.get(x[1],9999999999))
print(l3)
以这种方式使用 dict 的优点是在每次查找l2
不使用index(...)
。
您将使用dict.get()
来避免丢失键导致麻烦,只需提供一个肯定不在列表中的默认值,以便将它们放在最后/前面。
输出:
[(1, 'a', 'x'), (3, 'a', 'z'), (2, 'b', 'y'), (4, 'c', 'xyz')]
您也可以使用列表l1
的sort方法对每个元组的第二个值进行排序:
l1 = [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'a', 'z'), (4, 'c', 'xyz')]
l1.sort(key=lambda x: x[1])
print(l1)
如果这还不够,并且您需要第二个列表l2
来定义订单,则可以使用列表的index方法:
l1 = [(1, 'a', 'x'), (2, 'b', 'y'), (3, 'a', 'z'), (4, 'c', 'xyz')]
l2 = ['a', 'b', 'c']
l1.sort(key=lambda x: l2.index(x[1]))
print(l1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.