我想写一个函数比较两个列表具有相同的长度,函数返回两个列表中不同的两个元素在列表上的相同位置 例如比较两个元素在同一位置上的两个不同列表
如果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