Python 基于不同列表的匹配元素旋转列表

Python 基于不同列表的匹配元素旋转列表,python,Python,假设我有两个列表: 清单1 清单2 假设两个列表中始终有一个元素相同,我将如何将列表2重新排序为: [20, 13, 15] 其中15成为列表2的第三个元素,因为15是列表1的第三个元素(同时保留13、15和20的顺序)?我试过这样的方法: # Reorder list2 to correspond with list1 key = 0 newOrder = [] for i in range(3): for j in range(3): if list2[i]

假设我有两个列表: 清单1

清单2

假设两个列表中始终有一个元素相同,我将如何将列表2重新排序为:

[20, 13, 15]
其中15成为列表2的第三个元素,因为15是列表1的第三个元素(同时保留13、15和20的顺序)?我试过这样的方法:

# Reorder list2 to correspond with list1
key = 0
newOrder = []
for i in range(3):
   for j in range(3):
            if list2[i] == list1[j]:  # if elements 
                key = i - j
for k in range(3):
   index = k + key
   if index == 3:
            index = 0
   if index == -1:
            index = 2
   newOrder.append(list2[index])

但是它没有100%的成功率。

假设您希望旋转
list2
,以便“共享”元素与
list1
中的位置相同

首先,要获得匹配索引,不必比较所有元素。相反,您可以使用dict存储哪个元素在哪个位置,然后在一次传递中获得匹配位置
list2
(如果列表始终只有3个元素,这并不重要,但对于较长的列表,它将复杂性从O(n²)降低到O(n))

然后,当索引大于列表的长度时,您可以使用列表理解从
list2
使用模
%
获得“旋转”元素

n = len(list2)
res = [list2[(i+p2-p1) % n] for i in range(n)]
print(res) # [20, 13, 15]

这段代码获取列表1中也存在于列表2中的数字的值和索引

list1 = [26, 45, 15]
list2 = [13, 15, 20]

index, number = next((idx,number) for idx, number in enumerate(list1) if number in list2)
然后,它将从列表2中删除该数字,并将其再次插入到所需的索引中:

list2.remove(number)
list2.insert(index,number)

print(list2)
输出将是

[13, 20, 15]

“(在保留数字顺序的情况下)”那么它不应该是
[13,20,15]
?或者,您的意思是要“旋转”列表,直到匹配的元素位于正确的位置?序列不保留though@tobias_k我应该说得更清楚些。顺序保持不变(总是13、15、20的顺序)我理解这一点有困难。
当13、15、20的顺序保持不变时
我想他希望顺序保持不变
list1 = [26, 45, 15]
list2 = [13, 15, 20]

index, number = next((idx,number) for idx, number in enumerate(list1) if number in list2)
list2.remove(number)
list2.insert(index,number)

print(list2)
[13, 20, 15]