Python:根据列表副本上的结果顺序对列表进行排序
:在最后一部分中,我正在寻找一种比嵌套for循环更快的方法 假设我们有一个列表Python:根据列表副本上的结果顺序对列表进行排序,python,list,python-3.x,sorting,Python,List,Python 3.x,Sorting,:在最后一部分中,我正在寻找一种比嵌套for循环更快的方法 假设我们有一个列表a=[a\u 0,a\u 1,…,a\u n]。我们创建了一个名为b=[b_0,b_1,…,b_n]的a的深度副本,其中b_i和a_i是相同的对象,但分别存储。现在我们对b执行某种排序算法some\u sort,以获得排序order\u b=[b''u 0,b''u 1,…,b''n],其中那些b''u i是b中的相同对象(由于some\u sort算法是破坏性的,因此order\u b中的元素不再与b中的元素相同,但
a=[a\u 0,a\u 1,…,a\u n]
。我们创建了一个名为b=[b_0,b_1,…,b_n]
的a
的深度副本,其中b_i
和a_i
是相同的对象,但分别存储。现在我们对b
执行某种排序算法some\u sort
,以获得排序order\u b=[b''u 0,b''u 1,…,b''n]
,其中那些b''u i
是b
中的相同对象(由于some\u sort
算法是破坏性的,因此order\u b
中的元素不再与b
中的元素相同,但引用被保留)。现在,我希望a
按照order\u b
中的相同顺序进行排序,即,获得排序order\u a=[a''u 0,a''u 1,…,a''n]
这是从a
的一种排列,其排列方式与从b
的排列方式相同,但我不能对a
执行排序算法某些排序,因为该算法具有破坏性。有什么快速方法可以做到这一点吗
例如:a=[a_0,a_1,a_2,a_3]
,a
的深度副本是b=[b_0,b_1,b_2,b_3]
。b
的结果顺序是顺序b=[b_3,b_2,b_0,b_1]
,然后我想要的是获得顺序a=[a_3,a_2,a_1]
根据您提到的顺序,您在b''u i
中保留原始b''u i
引用,因此您可以创建{b''u i:idx}
的反向查找,例如(伪):
import copy
a = [2,4,3,1]
Out[94]: [2, 4, 3, 1]
#create a deep copy of a
b = copy.deepcopy(a)
Out[96]: [2, 4, 3, 1]
#add index of b and its value to a tuple
b1 = [(v,k) for k, v in enumerate(b)]
Out[98]: [(2, 0), (4, 1), (3, 2), (1, 3)]
#sort b1 (can using whatever criteria for sorting)
b1 = sorted(b1)
Out[100]: [(1, 3), (2, 0), (3, 2), (4, 1)]
#extract elements from a using the order of b1.
[a[e] for e in [e[-1] for e in b1]]
Out[101]: [1, 2, 3, 4]
演示,获取数字和字母的列表,将字母随机化,并以与随机化字母相同的顺序返回数字:
In [1]:
import random
a = list(range(10))
b = list('abcdefghij')
b_ = random.sample(b, k=len(b))
''.join(b_)
Out[1]:
'idfehbgacj'
In [2]:
mapping = {k: idx for idx, k in enumerate(b_)}
[m for m, n in sorted(zip(a,b), key=lambda x: mapping[x[1]])]
Out[2]:
[8, 3, 5, 4, 7, 1, 6, 0, 2, 9]
您提到您在b''u i
中保留了原始的b'u i
引用,因此您可以创建{b'u i:idx}
的反向查找,例如(pseudo):
演示,获取数字和字母的列表,将字母随机化,并以与随机化字母相同的顺序返回数字:
In [1]:
import random
a = list(range(10))
b = list('abcdefghij')
b_ = random.sample(b, k=len(b))
''.join(b_)
Out[1]:
'idfehbgacj'
In [2]:
mapping = {k: idx for idx, k in enumerate(b_)}
[m for m, n in sorted(zip(a,b), key=lambda x: mapping[x[1]])]
Out[2]:
[8, 3, 5, 4, 7, 1, 6, 0, 2, 9]
我有一个简单的解决方案:
a_u=[a[i]表示i in(b.索引(j)表示j in b_u)]
b_perm=[b中j的b.索引(j)]
a_u=[a[i]表示b_perm中的i]
import random
a = list(range(10))
b = list('abcdefghij')
b_ = random.sample(b, k=len(b))
b_ = ['c', 'b', 'f', 'i', 'e', 'a', 'h', 'g', 'j', 'd']
a_ = [a[i] for i in (b.index(j) for j in b_)]
a_ = [2, 1, 5, 8, 4, 0, 7, 6, 9, 3]
我有一个简单的解决方案:
a_u=[a[i]表示i in(b.索引(j)表示j in b_u)]
b_perm=[b中j的b.索引(j)]
a_u=[a[i]表示b_perm中的i]
import random
a = list(range(10))
b = list('abcdefghij')
b_ = random.sample(b, k=len(b))
b_ = ['c', 'b', 'f', 'i', 'e', 'a', 'h', 'g', 'j', 'd']
a_ = [a[i] for i in (b.index(j) for j in b_)]
a_ = [2, 1, 5, 8, 4, 0, 7, 6, 9, 3]
鉴于order\u b
只是一个副本,你就不能deepcopy
并分配给order\u a
。没有更多细节,很难知道你想做什么。@AChampion我很抱歉它们与b
不完全相同。请看我的编辑。@AChampion准确地说,a
是节点
实例的列表(我创建了一个节点
类,该类具有属性名称
和父节点
(父节点))形成一个图形。当some\u sort
作用于b
时,它会改变它的一些成员的parents
属性。因此order\u b
中的成员实际上是那些b
中的成员,首先被修改,然后被排序。既然order\u b
只是一个副本,你就不能deepcopy
并分配给order>吗_a
。如果没有更多的细节,很难说出你想做什么。@AChampion我很抱歉它们与b
不完全相同。请参阅我的编辑。@AChampion准确地说,a
是节点
实例的列表(我创建了一个节点
类,具有属性名称
和父类
(父节点))形成一个图形。当some\u sort
作用于b
时,它将改变其某些成员的parents
属性。因此order\u b
中的成员实际上是那些b
中的成员,首先被改变,然后被排序。谢谢。idx
是什么?idx
是枚举()给出的索引
。谢谢。什么是idx
?idx
是enumerate()
给出的索引。