在奇数/偶数整数列表中查找奇偶校验异常值

时间:2016-08-22 22:06:40

标签: python algorithm

我试图找到并返回奇数整数列表中的单个偶数整数或偶数整数列表中唯一的奇数整数。但是,如果奇数整数列表的长度为偶数,则我的代码有效,它返回列表中的第一个数字而不是偶数整数。任何帮助表示赞赏。代码如下:

    even = [2, 4, 6, 8, 10, 12, 14, 2091] #2091 is the outlier and len(x) = 8
    odd = [1, 3, 5, 7, 9, 11, 13, 4720] #4720 is the outlier and len(x) = 8

def find_outlier(x):
    # Determine if list is even and length of list is odd
    if sum(x) % 2 != 0 and len(x) % 2 != 0:
        for x in x:
            if x % 2 != 0:
                return x
    # Determine if list is even and length of list is even
    elif sum(x) % 2 != 0 and len(x) % 2 == 0:
        for x in x:
            if x % 2 != 0:
                return x
    # Determine if list is odd and length of list is odd
    elif sum(x) % 2 == 0 and len(x) % 2 != 0:
        for x in x:
            if x % 2 == 0:
                return x
    # Determine if list is odd and length of list is even (PROBLEM)
    elif sum(x) % 2 == 0 and len(x) % 2 == 0:
        for x in x:
            if x % 2 == 0:
                return x

print (find_outlier(even))
print (find_outlier(odd))

以下是Dmitri解决方案重新格式化问题的正确解决方案:

def find_outlier(x):
    odd = [i for i in x if i % 2 != 0]
    even = [i for i in x if i % 2 == 0]
    return odd[0] if len(odd) < len(even) else even[0]

3 个答案:

答案 0 :(得分:4)

你为什么要关心长度?这是一个更简单的解决方案:

def find_outliner(a):
    if a[0] % 2 != a[1] % 2:
        return a[0] if a[2] % 2 == a[1] % 2 else a[1]
    for i in a:
        if i % 2 != a[0] % 2:
            return i

它是如何运作的?

  1. 列表中应该至少有三个元素,否则问题没有多大意义
  2. 如果前两个元素具有不同的奇偶校验,则根据第三个来检查哪个元素是错误的(如果第二个和第三个具有相同的奇偶校验,则第一个是错误的,否则 - 第二个是错误的)
  3. 如果前两个元素具有相同的奇偶校验,则意味着第一个(和第二个)元素的奇偶校验是列表的正确奇偶校验。因此,具有不同奇偶性的元素是我们正在寻找的。

答案 1 :(得分:1)

问题是你正在对列表进行求和,试图用它来确定列表主要是赔率还是平均值。这不起作用,因为一个均衡列表的总和是偶数,但根据列表中的项目数,赔率的总和将是偶数或奇数。

相反,只需跟踪列表中的最后一个偶数和奇数,以及您是否看过多个给定类型。只要你有两个或两个赔率,你可以认为异常值是另一个。

此外,在每个IF子句中使用sum()和len()可能会非常低效,因为您多次执行此操作。

答案 2 :(得分:0)

只是另一种选择,在两个列表中收集平均值和赔率,然后使用较小的列表。

def find_outlier(x):
    evenodd = [], []
    for v in x:
        evenodd[v & 1].append(v)
    return min(evenodd, key=len)[0]

演示:

>>> for x in [2, 4, 6, 8, 10, 12, 14, 2091], [1, 3, 5, 7, 9, 11, 13, 4720]:
        print(find_outlier(x))

2091
4720