从奇数/偶数Python列表中删除偶数/奇数

d8a*_*nja 1 python list-comprehension list

我试图更好地理解Python中的列表理解.我完成了对代码战的在线挑战,其中包含一个相当不优雅的解决方案,如下所示.

挑战是:

  1. 给出偶数和一个奇数的列表,返回奇数
  2. 给出一个奇数和一个偶数的列表,返回偶数

我(不优雅)的解决方案是:

def find_outlier(integers):
    o = []
    e = []
    for i in integers:
        if i % 2 == 0:
            e.append(i)
        else:
            o.append(i)
    # use sums to return int type
    if len(o) == 1:
        return sum(o)
    else:
        return sum(e)
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但似乎是相当蛮力.我认为用占位符列表开始(大多数)函数o并且e非常"像noob一样" 我错了吗?

我希望更好地理解为什么这个解决方案适用于奇数列表,但是在偶数列表中失败,以便更好地理解列表理解:

def find_outlier(integers):
    if [x for x in integers if x % 2 == 0]:
       return [x for x in integers if x % 2 == 0]
    elif [x for x in integers if x % 2 != 0]:
       return [x for x in integers if x % 2 != 0]
    else:
        print "wtf!"

o = [1,3,4,5]
e = [2,4,6,7]

In[1]: find_outlier(o)
Out[1]: [4]

In[2]: find_outlier(e)
Out[2]: [2, 4, 6]
Run Code Online (Sandbox Code Playgroud)

哪里Out[2]应该回来7.

提前感谢任何见解.

Mar*_*ers 6

因为你的第一个尝试失败if总是要真实.你总会有一个至少包含1个元素的列表; 要么奇数输出是奇数,你测试了一个包含所有偶数的列表,否则你有一个列表中包含一个偶数.只有一个列表是错误的.

列表推导不是最好的解决方案,不是.尝试用最少数量的元素来解决它(前2个元素,如果它们的类型不同,则获得第3个以打破平局,否则迭代直到找到不适合尾部的元素):

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)
Run Code Online (Sandbox Code Playgroud)

StopIteration如果输入可迭代中少于3个元素,或者没有找到异常,则上面将抛出异常.它也不会处理存在多个异常的情况(例如,2甚至后跟2个奇数;在这种情况下将返回第一个奇数值).