为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕容3067478 2023-06-27 17:25:24
假设我有两个列表:List1[26, 45, 15]列表2[13, 15, 20]假设两个列表之间总是有一个元素相同,我将如何将 list2 重新排序为:[20, 13, 15]其中 15 成为 list2 的第三个元素,因为 15 是 list1 的第三个元素(同时保持 13、15、然后 20 的顺序)?我尝试过这样的事情:# Reorder list2 to correspond with list1key = 0newOrder = []for i in range(3):   for j in range(3):            if list2[i] == list1[j]:  # if elements                 key = i - jfor k in range(3):   index = k + key   if index == 3:            index = 0   if index == -1:            index = 2   newOrder.append(list2[index])但它的成功率并不是100%。
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

假设您想要旋转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]


查看完整回答
反对 回复 2023-06-27
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

此代码获取 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]


查看完整回答
反对 回复 2023-06-27
  • 2 回答
  • 0 关注
  • 132 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信