我试图找到并返回奇数整数列表中的单个偶数整数或偶数整数列表中唯一的奇数整数。但是,如果奇数整数列表的长度为偶数,则我的代码有效,它返回列表中的第一个数字而不是偶数整数。任何帮助表示赞赏。代码如下:
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]
答案 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 :(得分: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