繁体   English   中英

根据具有相同项目但顺序不同的另一个列表对具有重复项的列表进行排序

[英]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']

要根据lst1lst2进行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM