简单的设置:我有一个包含字符串列表(每个包含 2-15 个元素)的列表(大约 40,000 个条目)。我想比较所有的子列表来检查它们是否有一个共同的元素(它们最多共享一个)。最后,我想创建一个字典(如果您愿意,可以使用图形),其中每个子列表的索引用作键,其值是与它共享公共元素的其他子列表的索引。
例如
lst = [['dam', 'aam','adm', 'ada', 'adam'], ['va','ea','ev','eva'], ['va','aa','av','ava']]
应该给出以下内容:
dic = {0: [], 1: [2], 2: [1]}
我的问题是我找到了一个解决方案,但它的计算成本非常高。首先,我编写了一个函数来计算两个列表的交集:
def intersection(lst1, lst2):
temp = set(lst2)
lst3 = [value for value in lst1 if value in temp]
return lst3
然后我会遍历所有列表以检查交叉点:
dic = {}
iter_range = range(len(lst))
#loop over all lists where k != i
for i in iter_range:
#create range that doesn't contain i
new_range = list(iter_range)
new_range.remove(i)
lst = []
for k in new_range:
#check if the lists at position i and k intersect
if len(intersection(mod_names[i], mod_names[k])) > 0:
lst.append(k)
# fill dictionary
dic[i] = lst
我知道 for 循环很慢,而且我经常不必要地循环列表(在上面的示例中,我将 1 与 2 进行比较,然后将 2 与 1 进行比较),但我不知道如何更改它以使程序运行得更快。