比较特定索引处的2个列表列表,Python

时间:2018-12-27 19:47:34

标签: python list set

我有2个列表列表,我想比较两个列表中每个列表的子列表的内容(仅在特定索引处),然后在存在两个列表时保存两个列表和子列表的索引热门,例如比较:

  • 如果列表和子列表的索引存储相似,则第一个列表的索引5的子列表与第二个列表的索引0的子列表
  • 第一个列表的索引6的子列表和第二个列表的索引3的子列表,...
  • 第一个列表的索引7的子列表和第二个列表的索引6的子列表,...

以此类推。

我创建了一个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开始)的子列表的所有元素,但我要检查:

  • 仅在list1中索引5处的子列表,而仅在list2中索引0处的子列表
  • 列表1中索引6的子列表,仅列表2中索引3的子列表
  • 列表1中索引7的
  • 子列表仅在istt2中索引6的子列表 等等

我希望我写的东西有道理...任何建议都超出了欢迎范围

3 个答案:

答案 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])