如何使用python中的列表高效地对列表进行排序

如何使用python中的列表高效地对列表进行排序,python,Python,我有一份清单如下 mylist = [['dog', ['dogs details']], ['cat', ['cats details']], ['rat', ['rats details']], ['rabbit', ['rabbits details']], ['mouse', ['mice details']], ['goat', ['goats details']]] mynameslist = ["fish", "rabbit", "

我有一份清单如下

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_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
我还有一份名单如下

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_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
考虑到我名字列表的顺序,我想订购我的列表。i、 我的输出应该如下

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_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
我试着这样做

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_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
然而,我有很长的mylist和MyNameList。因为我的代码在^2上,所以创建mylist\u new需要很多时间。我想知道是否有一种更具蟒蛇风格的方法可以用更少的时间来完成这项工作

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

您可以使用sorted或sort在关键参数处进行排序,如下所示:

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"]
sorted(mylist, key=lambda x: mynameslist.index(x[0]))
#mylist.sort(key=lambda x: mynameslist.index(x[0]))
输出:

[['rabbit', ['rabbits details']],
 ['cat', ['cats details']],
 ['dog', ['dogs details']],
 ['rat', ['rats details']],
 ['mouse', ['mice details']],
 ['goat', ['goats details']]]
<>编辑:正如@ Juanga. RaviLaGa说的,这很快就可以实现对^ 2复杂度的降低,所以如果列表很大,你应该考虑使用他的答案而不是

你可以使用排序或排序来排序这样的关键参数:
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"]
sorted(mylist, key=lambda x: mynameslist.index(x[0]))
#mylist.sort(key=lambda x: mynameslist.index(x[0]))
输出:

[['rabbit', ['rabbits details']],
 ['cat', ['cats details']],
 ['dog', ['dogs details']],
 ['rat', ['rats details']],
 ['mouse', ['mice details']],
 ['goat', ['goats details']]]
<>编辑:正如@ Juanga. RaviLaGa说的,这很快就能实现对^ 2复杂度的降低,所以如果列表很大,你应该考虑使用他的答案而不是

< P>创建一个从动物名称到索引的图:

>>> namemap = {e:i for i,e in enumerate(mynameslist)}
然后将其用作排序的键:

由于namemap[x[0]]将是常数时间,因此它将在*logN上与现在排序的相同

或者,根据您的数据是否表现良好,您可以在“上”中执行此操作,从原始列表中绘制地图:

>>> 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中存在重复项,则此操作将不起作用

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

>>> namemap = {e:i for i,e in enumerate(mynameslist)}
然后将其用作排序的键:

由于namemap[x[0]]将是常数时间,因此它将在*logN上与现在排序的相同

或者,根据您的数据是否表现良好,您可以在“上”中执行此操作,从原始列表中绘制地图:

>>> 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中存在重复项,则此操作无效