【问题标题】:How to Sort a List of Tuples based on the item order of another List如何根据另一个列表的项目顺序对元组列表进行排序
【发布时间】:2021-06-14 22:39:57
【问题描述】:

我有一个清单:l = ['orange', 'banana', 'apple', 'pear']

我还有一个元组列表,每个元组中的第一项与先前列表中的值匹配:list_tuples = [('pear',value),('apple',value),('orange',value),('banana',value)]

有什么方法可以根据列表l 的顺序对list_tuples 中的元组进行重新排序?那么list_tuples 的预期输出将是[('orange',value),('banana',value),('apple',value),('pear',value)]

【问题讨论】:

  • 试试获取list + function + revers的函数sorted或者函数list.sort()

标签: python list tuples


【解决方案1】:

您可以为sorted 编写一个自定义key-function,考虑列表中的索引(位置):

>>> l = ["orange", "banana", "apple", "pear"]
>>> list_tuples = [("pear","value"),("apple","value"),("orange","value"),("banana","value")]
>>> sorted(list_tuples, key=lambda x: l.index(x[0]))
[('orange', 'value'), ('banana', 'value'), ('apple', 'value'), ('pear', 'value')]

【讨论】:

  • 这会不必要地花费 O(n ^ 2 x log n) 的时间复杂度。
  • @blhsing OP 没有要求有效的解决方案。您为什么不建议一种更好、更高效的方法?
【解决方案2】:

您可以使用 for 循环。但出于性能原因,我建议使用 .sort 函数。它还使您的代码看起来干净。

无论如何,这里有一个代码可以满足您的需求。 我使用自定义键来访问第一个列表中元素的索引,然后使用它对第二个列表进行排序。请注意,这仅在第一个列表中没有重复项时才有效。如果有,那么你应该使用 for 循环。

first_list = ['orange', 'banana', 'apple', 'pear']

value = 0 # value doesn't matter here.

def custom_sort(element):
    return first_list.index(element[0])

second_list = [('pear',value),('apple',value),('orange',value),('banana',value)]

second_list.sort(key=custom_sort)

print(second_list)

【讨论】:

  • 看起来像@Sven 发布的答案,但没有lambda ...
  • 是的。只是这对于不熟悉 lambda 的人来说更容易理解。他的回答虽然更干净。如果我是为自己写的,我会用 lambda 写的。
猜你喜欢
  • 2022-01-24
  • 2012-08-27
  • 2022-01-18
  • 1970-01-01
  • 2019-02-16
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
相关资源
最近更新 更多