繁体   English   中英

根据另一个列表对元组列表进行排序

[英]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')]

您也可以使用列表l1sort方法对每个元组的第二个值进行排序:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM