哦,天哪,所以我的有点乱,但是我没有使用任何导入,并且我包括了两个最相似的列表的初始“发现”。这可以很容易地进行优化,但它确实可以满足您的需求。
my_list_of_list=[['A','B','C','E'],['A','B','C','E','F'],['D','G','A'],['X','Z'],['D','M'],['B','G'],['X','Z']]
my_list_of_list = list(map(set,my_list_of_list))
mostIntersects = [0, (None,)]
for i, IndSet in enumerate(my_list_of_list):
for j in range(i+1,len(my_list_of_list)):
intersects = len(IndSet.intersection(my_list_of_list[j]))
if intersects > mostIntersects[0]: mostIntersects = [intersects, (i,j)]
FinalIntersection = set(my_list_of_list[mostIntersects[1][0]]).intersection(my_list_of_list[mostIntersects[1][1]])
skipIndexes = set(mostIntersects[1])
for i,sub_list in enumerate(my_list_of_list):
[skipIndexes.add(i) for char in sub_list
if i not in skipIndexes and char in FinalIntersection]
print(*map(list,(mostIntersects, FinalIntersection, skipIndexes)), sep = '\n')
印刷品提供了这一点:
[4, (0, 1)]
['E', 'C', 'B', 'A']
[0, 1, 2, 5]
首先使用 map 函数将列表转换为集合(必须将其转回列表,以便我可以使用 len 并正确迭代)然后将每个列表与列表列表中的其他列表相交并计数每个中有多少元素。每次我找到一个更大的数字时,我将 mostIntersections 设置为等于 len 和设置的索引。一旦我完成了所有这些,我得到两个索引处的列表(在本例中为 0 和 1)并将它们相交以给出元素列表 [A,B,C,E] (var:finalIntersection)。从那里,我只是遍历所有尚未使用的列表,并检查是否在 finalIntersection 中找到了任何元素。如果是,则将列表的索引附加到skipIndexes。这导致索引的最终列表 {indices? idk} 你所追求的。从技术上讲,结果是一个集合,但要将其转换回来,您只需使用 list({0,1,2,5}) 即可获得您所追求的值。