【问题标题】:Rearranging list based on order of another list根据另一个列表的顺序重新排列列表
【发布时间】:2015-02-27 19:31:33
【问题描述】:

我确信以前可能有人问过这个问题,但我似乎找不到正确的答案。如果我有两个列表

_list1 = ["keyName", "test1", "test2"]
_list2 = ["keyName", "test2", "test1"]

我正在尝试使用 _list1 重新排列 _list2 中的元素,以便它们完全匹配顺序。最干净的方法是什么?期望的输出:

_list1 = ["keyName", "test1", "test2"]
_list2 = ["keyName", "test1", "test2"]

如果这是重复的,我很抱歉,但到目前为止,我只能找到数字列表的答案并使用 zipped sorted() 方法。

如果 _list2 是列表列表怎么办?

_list2 = [["test1", "test2", "keyName"], ["test2", "test1", "keyName"]]

期望的输出:

_list2 = [["keyName", "test1", "test2"], ["keyName", "test1", "test2"]]

还有一个假设:如果我想使用 _list1 作为键对任何其他对象列表进行排序,该怎么办

_list2 = [[object1, object2, object3], [object1, object2, object3]]

地点:

object1.Name = "keyName"
object3.Name = "test1"
object2.Name = "test2"

如此有效,我希望输出:

_list2 = [[object1, object3, objec1], [object1, object3, objec1]]

这可能吗?

【问题讨论】:

  • 两个列表的值是否完全相同?
  • 是的,它们都将具有相同的字符串值。还有一点需要注意的是,_list2 可能是一个嵌套的列表列表,其中包含相同字符串值的列表,例如 _list2=[["test1", "keyName","test2"]["test2", "test1" , "键名"]]。所以值总是相同的,只是有时_list2的结构可能会改变

标签: python list sorting


【解决方案1】:

尝试使用带排序的键:

sorted(_list2,key=_list1.index)

对于嵌套列表,您可以使用 list comphresnion:

[sorted(x,key=_lis1.index) for x in _list2]

【讨论】:

  • sorted() 如果 list2 中有元素在 list 1 中不存在,则不起作用
【解决方案2】:
In [84]: _list1 = ["keyName", "test1", "test2"]

In [85]: d = {k:v for v,k in enumerate(_list1)}

In [86]: _list2 = ["keyName", "test2", "test1"]

In [87]: _list2.sort(key=d.get)

In [88]: _list2
Out[88]: ['keyName', 'test1', 'test2']

【讨论】:

  • 使用 dict 会更快,因为 get 有 O(1) 而 index 有 O(n)。好:)
猜你喜欢
  • 2019-07-09
  • 2018-01-03
  • 2018-09-15
  • 2012-08-27
  • 1970-01-01
  • 2021-05-21
  • 1970-01-01
  • 2022-11-16
  • 2013-09-17
相关资源
最近更新 更多