2015-04-05 138 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(或者如果你喜欢原始列表)。

相关问题