【问题标题】:Python:Find if all elements in lists are the same except exactly 2 numbersPython:查找列表中的所有元素是否相同,除了正好 2 个数字
【发布时间】:2018-10-27 02:14:48
【问题描述】:

我想知道如何检查两个数字列表是否相同,除了正好 2 个数字

if list1 == list2: # + except 2 numbers

【问题讨论】:

  • “两个数字除外”是什么意思?列表仅相差两个?
  • 你能举个例子吗?
  • 例如,如果第一个列表有 1,2,3,4,5 和第二个 1,2,3,6,7 则为真
  • 你可以试试这个:result = len([i for i in list1 if i not in list2]) == 2
  • list1list2 可以包含重复项吗?

标签: python list numbers int


【解决方案1】:
def differ_by_two(l1, l2):
    return sum(1 for i,j in zip(l1, l2) if i!=j) == 2

例子

>>> differ_by_two([1,2,3],[1,4,5])
True
>>> differ_by_two([1,2,3,4,5],[6,7,8,9,10])
False

【讨论】:

    【解决方案2】:

    如果列表元素的顺序很重要,您可以使用以下内容:

    if sum(i != j for i, j in zip(list1, list2)) == 2:
        # the two lists are equal except two elements
    

    如果顺序不重要,重复元素无关紧要,你也可以使用集合交集(&)并比较长度:

    if len(set(list1) & set(list2)) == len(list1) - 2:
        # the two list are equal except two elements
    

    如果顺序不重要,但重复元素很重要,请使用相同的方法,但使用collections.Counter

    from collections import Counter
    if len(Counter(list1) & Counter(list2)) == len(list1) - 2:
        # the two list are equal except two elements
    

    【讨论】:

    • 你也可以使用 set union,虽然我不确定它是否会更快。if len(set(list1) | set(list2)) == len(list1) + 2:
    • 实际上,使用 set 的解决方案是行不通的,因为 OP 澄清了可以有重复的元素。你必须使用 C++ 的多重集,但我认为 Python 默认没有。
    • @Helium_1s2 python的multiset是collections.Counter,但是OP没有说明顺序是否重要
    • op 已澄清可能存在重复元素,因此常规集合在这些情况下不起作用。我是说您需要在顺序不重要的情况下使用多重集。
    • @Helium_1s2 是的,我同意。我只是想指出,在任何一种情况下(set 或 Counter),元素的顺序都将被忽略。
    【解决方案3】:
    def SameBarTwo(l1, l2):
        a = len(l2)
        for i in range(len(l2)):
            if l2[i] in l1:
                l1.remove(l2[i])
                a -= 1
        return a == 2
    

    这将为重复值提供便利,不考虑顺序。

    【讨论】:

      猜你喜欢
      • 2011-01-30
      • 1970-01-01
      • 2011-04-20
      • 2020-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多