我想寫一個函數比較兩個列表具有相同的長度,函數返回兩個列表中不同的兩個元素在列表上的相同位置 例如比較兩個元素在同一位置上的兩個不同列表
如果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]
的功能應該給我虛假的結果,因爲在不同位置的兩個項目列表中的
任何幫助,將不勝感激
我想寫一個函數比較兩個列表具有相同的長度,函數返回兩個列表中不同的兩個元素在列表上的相同位置 例如比較兩個元素在同一位置上的兩個不同列表
如果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來算,你可以用幾種方式:一爲用計數器,差異列表的長度,或甚至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
你可以通過列表理解來做到這一點,,
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
希望它可以幫助,,,
你也可以做到這一點懶洋洋......並在第一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兩個iterablesislice(not_equal, n, None)
並呼籲它next
,我們試圖從上述發電機
False
秒 - 這樣的名單超過閾值來匹配 - 所以我們回到False
的值(第n項目 - 因爲整個發電機只返回False
)next
返回True
默認值,而不是養StopIteration
的 - 這意味着我們還沒有超過閾值...您可以停止,如果超過了比較標準比較相應的元素並返回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
有一條線,一個良好的自我記錄變量名變壞...它可能只是因爲你越過了這條線:D – 2015-04-05 10:32:25
由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(或者如果你喜歡原始列表)。
'a == b'呢? – 2015-04-05 08:39:54