我有一个很大的DOI列表,我需要最有效的方法来识别重复的DOI(例如,打印出索引和重复值的DOI)。DOI的数组可以包含500000多个DOI。我目前的方法是(inspired by this answer):
from collections import defaultdict
D = defaultdict(list)
for i,item in enumerate(doiList):
D[item].append(i)
D = {k:v for k,v in D.items() if len(v)>1}
print (D)
有没有更高效的处理方法?在
DOI列表示例:
^{pr2}$
下面是一个完整的解决方案,它返回与示例相同的数据集,只是速度快了两倍多(以牺牲一些内存为代价):
存储的索引是第一次出现已找到的重复项,如您的示例所示。如果要存储所有重复的索引,可以在
lookup[v][1] += 1
行后添加lookup[v].append(i)
,但这样数据可能看起来很奇怪(结构应该是[first_index, number_of_occurrences, second_index, third_index...]
)相反,只需在}而不是{}中翻转存储的参数,然后
lookup[v]
修改-lookup[v] = [0, i]
而不是lookup[v] = [i, 0]
和{lookup[v].append(i)
将以:[number_of_occurrences, first_index, second_index, third_index...]
的形式给出一个很好的结果。在尝试将它们存储在^{} 中。可以将重复项附加到单个列表中,这可能会加快速度:
此时,
seen
包含所有不同的doi值,而dupes
包含重复值的所有第二、第三等索引。您可以在doiList
中查找它们,以确定哪个索引对应于哪个值。在要获得更好的性能,可以缓存以下方法:
^{pr2}$相关问题 更多 >
编程相关推荐