2012-11-23 72 views
0
def compare_two_lists(list1,list2): 
    i=0 
    j=0 
    while i < len(list2) : 
     if i%2 == 0: 
     j == 0 
     else: 
     j == 1 
     for sublist2 in list2[i:] : 
     for sublist in list1[j:]: 
      #sublist.intersection(sublist2) 
      intersect = [x for x in sublist if x in sublist2] 
      print('from set ',sublist, len(intersect),' matched number(s): ', intersect) 
      i=i +1 

compare_two_lists([[1,2,3,4,5],[20,30]],[[5,3,7,8,1],[20,10],[4,10,1,7,8],[30,20]]) 

我想获得列表1中的列表0和列表1,以便比较列表2中的列表0,1,2和3并返回匹配项。该程序几乎适用于它在其他迭代中确实返回匹配的列表。我似乎无法获得迭代发生两次并返回[1,3,5],[20], [1,4],[20,30]。请帮忙。我非常生气,试图理解如何正确地分隔功能并且逻辑地使用循环!python匹配列表的列表

+0

因此通过“设置”您的意思是“名单” ......看看他们,他们是不同的东西 – Sheena

回答

0
def compare_two_lists(list1,list2): 
    lRet = []       #a 
    for i in range(len(list2)):  #b 
     j= i%2      #c 
     sublist1 = list1[j]   
     sublist2 = list2[i]   
     lRet.append([x for x in sublist1 if x in sublist2]) 
    return lRet 

compare_two_lists([[1,2,3,4,5],[20,30]],[[5,3,7,8,1],[20,10],[4,10,1,7,8],[30,20]]) 

这似乎是个伎俩。这里有一个解释(参见上面的线标签):

  • a:lRet被初始化。我们正在建立这个变量列表的列表
  • b:我遍历列表2的每个索引
  • c:如果我是偶数,那么j是零,否则j是1。你的代码中有j==1j==0。这些运算符不会更改任何操作数值。你的意思是j=1等,但这种方式更快

为了解释其余的我就通过实际的迭代你的榜样输入列表议论:

I = 0(第一次迭代)

j=0 
sublist1 = [1,2,3,4,5] 
sublist2 = [5,3,7,8,1] 
intersection is [1,3,5]. we APPEND this to lRet. 
thus lRet = [[1,3,5],] 

I = 1

j=1 
sublist1 = [20,30] 
sublist2 = [20,10] 
the intersection is [20,] 
thus lRet = [[1,3,5],[20]] 

I = 3

j=0 
sublist1 = [1,2,3,4,5] 
sublist2 = [4,10,1,7,8] 
etc 
+0

对不起的速度比较慢。非常感谢您的帮助。我对任何对这个问题感兴趣的人感到绝望。将尝试通过你的解决方案,更多的理解逻辑! – user1478335

+0

太棒了。完美地工作,并感谢您的解释。现在更清楚了 – user1478335