Python 比较同一位置两个元素中不同的两个列表

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] 函数应该给我错误的结果,因为这两个项在列表中的位置不同 任何帮助都将不胜感激。好吧,我的方法是计算差异的数量,然后检查它是否小于

我想写一个函数,比较两个长度相同的列表,该函数返回两个列表,这两个列表在列表上相同位置的两个项目中是不同的 比如说

如果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