我有2个列表列表,我想比较两个列表中每个列表的子列表的内容(仅在特定索引处),然后在存在两个列表时保存两个列表和子列表的索引热门,例如比较:
以此类推。
我创建了一个for循环,该循环从索引5开始读取第一个列表的所有内容以及它们的索引,并创建了一个嵌套的for循环,将它们与第二个列表的所有子列表进行比较(从0到3进行迭代)到6等。然后,通过在每次迭代时比较两个集合的交集,我将所有公共元素的索引保存在所有子列表中。
common_a = []
common_b = []
for index_external, item in enumerate(data_db[5:]): #from 5 onwards
for index_eternal2, item_2 in enumerate(data_ga[::3]): #every three
both = set(item).intersection(item_2)
common_a.append([item.index(x) for x in both])
common_b.append([item_2.index(x) for x in both])
问题是,这将检查第二个列表的每个第三个子列表的第一个列表(从位置5开始)的子列表的所有元素,但我要检查:
我希望我写的东西有道理...任何建议都超出了欢迎范围
答案 0 :(得分:4)
问题是您已使用嵌套循环来处理单个参数。两个索引之间存在直接的线性关系。例如:
master
更好的是,只需for idx1 in range(5, len(data_db)):
idx2 = 3*(idx1 - 5)
if data_db[idx1] == data_ga[idx2]:
# Your code
一起添加所需的元素:
zip
答案 1 :(得分:0)
您不需要两个for循环/嵌套循环。一个循环将解决您的问题,在该循环中,循环的每次迭代都将list1递增1,将list2递增3。
答案 2 :(得分:0)
根据Prune的回答,这就是我最终解决它的方式:
# -----------
common_a = []
common_b = []
hits_idx1 = []
hits_idx2 = []
for idx1 in range(4, len(data_db)):
idx2 = 3*(idx1 - 4)
if (idx2 < len(data_ga)): #dont get over the 2nd list's length
both = set(data_db[idx1]).intersection(data_ga[idx2])
if both: # if it contains elements
hits_idx1.append(idx1) # save the indexes of the hits external list data_db
hits_idx2.append(idx2) # save the indexes of the hits external list data_ga
common_a.append([data_db[idx1].index(x) for x in both]) #the indexes of the internal lists common elements
common_b.append([data_ga[idx2].index(x) for x in both])