根据不同列表的匹配元素旋转列表

假设我有两个列表:List1


[26, 45, 15]

列表2


[13, 15, 20]

假设两个列表之间总是有一个元素相同,我将如何将 list2 重新排序为:


[20, 13, 15]

其中 15 成为 list2 的第三个元素,因为 15 是 list1 的第三个元素(同时保持 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%。


慕容3067478
浏览 133回答 2
2回答

皈依舞

假设您想要旋转list2以使“共享”元素位于与 中相同的位置list1。首先,要获得匹配的索引,您不必比较所有元素。相反,您可以使用字典来存储哪个元素位于哪个位置,然后在一次传递中获取匹配位置list2(如果列表始终只有 3 个元素,这并不重要,但对于较长的列表,它会降低复杂性O(n²) 至 O(n))list1 = [26, 45, 15]list2 = [13, 15, 20]pos2 = {x: i for i, x in enumerate(list2)}p1, p2 = next((i, pos2[x]) for i, x in enumerate(list1) if x in pos2)然后,当索引大于列表的长度时,您可以使用列表理解来list2使用模数“环绕”来获取“旋转”元素。%n = len(list2)res = [list2[(i+p2-p1) % n] for i in range(n)]print(res) # [20, 13, 15]

米琪卡哇伊

此代码获取 list1 中也存在于 list2 中的数字的值和索引。list1 = [26, 45, 15]list2 = [13, 15, 20]index, number = next((idx,number) for idx, number in enumerate(list1) if number in list2)然后它从 list2 中删除该数字并将其再次插入到所需的索引处:list2.remove(number)list2.insert(index,number)print(list2)输出将是[13, 20, 15]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python