因为你的第一个尝试失败if
时 总是要真实 。您将始终拥有至少包含1个元素的列表;要么单数是奇数,并且您测试了带有所有偶数的列表,否则您的列表中就有一个 偶数。只有一个 空 列表将为假。
列表理解不是最好的解决方案,不是。尝试用最少的元素检查数来解决(如果前两个元素在类型上不同,则获得第三个来打破平局,否则迭代直到找到不适合尾部的元素):
def find_outlier(iterable):
it = iter(iterable)
first = next(it)
second = next(it)
parity = first % 2
if second % 2 != parity:
# odd one out is first or second, 3rd will tell which
return first if next(it) % 2 != parity else second
else:
# the odd one out is later on; iterate until we find the exception
return next(i for i in it if i % 2 != parity)
StopIteration
如果输入可迭代输入中的元素少于3个,或者没有异常,则以上内容将引发异常。它也不会处理一个以上异常的情况(例如2个偶数后跟2个奇数;在这种情况下将返回第一个奇数)。