2016-12-06 70 views
1

我有兩個列表,並且需要計算列表中元素的次數是完全匹配的次數是相同的位置作爲另一個列表。因此,例如:如何計算列表中的元素與另一個列表的精確匹配次數 - python

list1 = [1,2,3,4] 
list2 = [1,2,4,3] 

將返回2. 我有以下代碼:

count = 0 
def corrpos(list1, list2, count): 
    if list1[0] == list2[0]: 
      count = 1 
    return count 

這個工程的第一個元素進行比較,但我不確定如何讓它保持跟蹤所有元素。有小費嗎?

+1

不必返回'count' – depperm

回答

0

你可以做到這一點的另一種方法是看這兩個列表的交集採用集:

>>>set(list1) & set(list2) 
set([1, 2, 3, 4]) 

然後,你可以使用len函數來獲取一個計數:

>>>len(set(list1) & set(list2)) 
4 

更新:

鑑於該元素必須在同一個索引位置,我會用一個列表理解:

def corrpos(list1,list2): 
    return len([i for (c,i) in enumerate(list1) if list2[c]==i]) 

這裏enumerate功能跟蹤該指數的位置,你遍歷list1,可用於查找list2中的對應值。

如果你想使用for循環,這可以被改寫爲:

def corrpos(list1,list2): 
    count=0 
    for (c,i) in enumerate(list1): 
     if list2[c]==i: count+=1 
    return count 
1

你可以做一個列表理解並計算存在於列表2使用LEN列表1中元素的個數():

print len([x for x in list1 if x in list2]) 

你自己的代碼也在努力,你就只需要返回計數(和正確更改參數的輸入列表2):

return count 
+0

或者你可以創建集: '打印(LEN(集(list1的).intersection(集(列表2))))'。 – Matthias

+0

如果要計算list1和list2中有多少個值,則只能使用set。 –

1

爲了完整起見,我將使用提出了一個答案內置zip,所以由@中的最後答案LMC可以被改寫爲:

def corrpos(list1, list2): 
    count = 0 
    for elem1, elem2 in zip(list1, list2): 
     if elem1 == elem2: 
      count += 1 
    return count 

它並沒有真正提供更多的東西,但zip讓您「在同一時間」兩個iterables迭代,我想這種方法不是必須使用更直觀的指數元素從第一個列表中選擇第二個列表中的元素,如enumerate所示。

當然它也可以被改寫成爲oneliner在其他的答案:

def corrpos(list1, list2): 
    return sum(1 for elem1, elem2 in zip(list1, list2) if elem1 == elem2) 

def corrpos(list1, list2): 
    return len([True for elem1, elem2 in zip(list1, list2) if elem1 == elem2]) 
相關問題