2015-04-05 149 views
0

我想寫一個函數比較兩個列表具有相同的長度,函數返回兩個列表中不同的兩個元素在列表上的相同位置 例如比較兩個元素在同一位置上的兩個不同列表

如果a=[0,33,2,3,4,66,9]b=[0,22,2,3,4,77,9]

函數返回這兩個列表,因爲有兩個因素是不同的,每一件事情是一樣的,但如果它比較: 如果c=[0, 2,3,33,4,66,9]b=[0,22,2,3,4,77,9] 的功能應該給我虛假的結果,因爲在不同位置的兩個項目列表中的

任何幫助,將不勝感激

+2

'a == b'呢? – 2015-04-05 08:39:54

回答

0

嗯,我的做法是算差的數量,然後檢查它是否小於或等於大於2來算,你可以用幾種方式:一爲用計數器,差異列表的長度,或甚至1列表和循環,如果元素是不同的:

def weird_cmp(list1, list2): 
    if len(list1) != len(list2): 
     return False 
    number_of_differences = sum(1 for e1, e2 in zip(list1, list2) if e1 != e2) 
    return number_of_differences <= 2 
0

你可以通過列表理解來做到這一點,,

def comp_by_2_places(list1, list2): 
    return True if len([False for x,y in zip(a,b) if x != y])== 2 else False 

希望它可以幫助,,,

4

你也可以做到這一點懶洋洋......並在第一n很多不匹配的停止 - 所以,如果你有大量的iterables,你可以只要你停止確定還有的是太多的錯配 - 而不是過程所有的人,然後看看是否已超過閾值,例如:

from itertools import islice, izip 

def no_diff_by(a, b, n): 
    not_equal = (False for x, y in izip(a, b) if x != y) 
    return next(islice(not_equal, n, None), True) 

方式工作的:

  • 建立一個發電機,它返回False for e兩個iterables
  • 之間ACH不相等的值通過使用islice(not_equal, n, None)並呼籲它next,我們試圖從上述發電機
    • 一個值的訪問訪問第n個值 - 這意味着已經有太多許多False秒 - 這樣的名單超過閾值來匹配 - 所以我們回到False的值(第n項目 - 因爲整個發電機只返回False
    • 當值訪問然後next返回True默認值,而不是養StopIteration的 - 這意味着我們還沒有超過閾值...
1

您可以停止,如果超過了比較標準比較相應的元素並返回false 。 else套件在for之後執行,但只有在for正常終止(而不是中斷)時才執行。如果比較完全符合cirteria,則函數返回True。我用這個休息來強調這個動作。因此,一旦你退出這個功能,就會在這裏突破。

def compare(list1, list2, how_many_elements_must_differ_at_the_same_position): 

    different_elements = 0 

    for x, y in zip(list1, list2): 
     if x != y: 
      different_elements += 1 
      if different_elements > how_many_elements_must_differ_at_the_same_position: 
       break 
    else: 
     if different_elements == how_many_elements_must_differ_at_the_same_position: 
      return True 
     else: 
      return False 

    return False 
+2

有一條線,一個良好的自我記錄變量名變壞...它可能只是因爲你越過了這條線:D – 2015-04-05 10:32:25

2

由Jon的回答啓發是短路,一旦達到閾值,這裏是一個解決方案,是一個有點簡單,不涉及一些瘋狂的itertools法寶:

def no_diff_by(a, b, n): 
    for x in (1 for x, y in zip(a, b) if x != y): 
     n -= 1 
     if n < 0: 
      return False 
    return True 

基本上,它使用生成器功能(和Python 3的zip-你想用Python 2中的izip)來懶惰地獲取下一個不匹配的對。並且對於每一對,它減少一個計數器。如果我們低於零,我們發現了比允許的更多的非匹配對,所以我們可以返回false。否則,循環將繼續,直到它最終完成,然後我們可以返回true(或者如果你喜歡原始列表)。

相關問題