[英]Sort a list with duplicates based on another list with same items but different order
我有两个这样的字符串列表(两个列表具有相同的项目但顺序不同):
lst1 = ['C', 'H', 'H', 'H', 'C', 'O', 'O', 'H']
lst2 = ['H', 'H', 'C', 'O', 'H', 'O', 'H', 'C']
要根据lst1
对lst2
进行lst1
,我想找到lst1
每个项目的lst2
索引。 对于重复项,我想采用尚未采用的最小索引。
我想知道获取这样的索引列表的最快方法:
ids = [2, 0, 1, 4, 7, 3, 5, 6]
然后我可以对lst2
进行排序
newlst2 = [lst2[i] for i in ids]
由于存在重复项,获取列表索引的正常方法
ids = [lst2.index(x) for x in lst1]
会给出错误的结果
ids = [2, 0, 0, 0, 2, 3, 3, 0]
有什么建议?
您可以收集每个值的索引,然后使用这些集合。 花费 O(n) 时间。
from collections import defaultdict, deque
indexes = defaultdict(deque)
for i, x in enumerate(lst2):
indexes[x].append(i)
ids = [indexes[x].popleft() for x in lst1]
虽然理论上不是最快的O(n2)
,对于对分子中原子位置进行排序的用例,如评论中所示(假设分子大小为样本顺序:10ish 原子),这种简单的方法,使用内置函数可能比其他需要导入多个外部库的更复杂的答案( O(n)
)更快。
您可以将lst1
( start
) 的每个元素索引到lst2
( model
),并将lst2
找到的元素替换为None
:
start = ['C', 'H', 'H', 'H', 'C', 'O', 'O', 'H']
model = ['H', 'H', 'C', 'O', 'H', 'O', 'H', 'C']
res = []
for elt in start:
idx = model.index(elt)
res.append(idx)
model[idx] = None
res # [2, 0, 1, 4, 7, 3, 5, 6]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.