首页 > 解决方案 > 如何使用python中的列表有效地对列表进行排序

问题描述

我有一个列表如下。

mylist = [['dog', ['dogs details']], ['cat', ['cats details']], ['rat', ['rats details']], ['rabbit', ['rabbits details']], ['mouse', ['mice details']], ['goat', ['goats details']]]

我也有一个名单如下。

mynameslist = ["fish", "rabbit", "cow", "cat", "dog", "owl", "rat", "mouse", "parrot", "goat", "emjenne", "emj"]

mylist考虑到 的顺序,我想订购mynameslist。即我的输出应该如下。

mylist_new = [['rabbit', ['rabbits details']], ['cat', ['cats details']], ['dog', ['dogs details']], ['rat', ['rats details']], ['mouse', ['mice details']], ['goat', ['goats details']]]

我试图这样做如下。

mylist_new = []
for item in mynameslist:
   for val in mylist:
       if val[0] == item:
           mylist_new.append(val)
           break

不过,我真的很mylistmynameslist。由于我的代码是 O(n^2),因此创建mylist_new. 我想知道是否有一种更 Pythonic 的方式可以用更少的时间做到这一点。

如果需要,我很乐意提供更多详细信息。

标签: python

解决方案


创建从动物名称到索引的映射:

>>> namemap = {e:i for i,e in enumerate(mynameslist)}

然后将其用作键sorted

>>> sorted(mylist, key=lambda x: namemap[x[0]])
[['rabbit', ['rabbits details']], ['cat', ['cats details']], ['dog', ['dogs details']], ['rat', ['rats details']], ['mouse', ['mice details']], ['goat', ['goats details']]]
>>>

这将是 O(N*logN) 与sorted现在相同,因为namemap[x[0]]将是恒定时间。

或者,根据您的数据是否表现良好,您可以在 O(N) 中执行此操作,从原始列表中制作地图:

>>> animal_map = dict(mylist)

然后使用映射遍历名称列表以重建:

>>> [[name, animal_map[name]] for name in mynameslist if name in animal_map]
[['rabbit', ['rabbits details']], ['cat', ['cats details']], ['dog', ['dogs details']], ['rat', ['rats details']], ['mouse', ['mice details']], ['goat', ['goats details']]]
>>>

如果有重复,这将不起作用mylist


推荐阅读