Python 比较同一位置两个元素中不同的两个列表
我想写一个函数,比较两个长度相同的列表,该函数返回两个列表,这两个列表在列表上相同位置的两个项目中是不同的 比如说 如果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] 函数应该给我错误的结果,因为这两个项在列表中的位置不同Python 比较同一位置两个元素中不同的两个列表,python,Python,我想写一个函数,比较两个长度相同的列表,该函数返回两个列表,这两个列表在列表上相同位置的两个项目中是不同的 比如说 如果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。要计数,可以使用几种方法:带计数器的for循环、差异列表的长度,或者如果元素不同,甚至是带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)
其工作方式:
构建一个生成器,为两个ITerable之间的每个不相等值返回False
通过使用islicenotu_equal,n,None并对其调用next,我们尝试从上述生成器访问第n个值
如果一个值是可访问的-这意味着有太多的False-因此列表超过了匹配的阈值-因此我们在第n项中返回False的值-因为整个生成器只返回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
受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
基本上,这使用了生成器特性和Python3的zip,您希望将izip与Python2一起使用,以惰性地获得下一个不匹配的对。对于每一对,它将计数器递减一。如果我们低于零,我们发现了比允许的更多的不匹配对,所以我们可以返回false。否则,循环将继续,直到它最终完成,在这一点上,如果您愿意,我们可以返回true或原始列表。a==b呢?有一行,一个好的自记录变量名变为坏。。。可能只是你越界了:D