2012-11-23 71 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