子列表的列表理解

2024-04-28 22:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

作为一个计算机科学的初学者,我被指派编写一个函数,将奇偶数的列表分为两个子列表。等待。。。别投我一票。我已经自学了一点,并尝试了列表理解和timeit,我想知道我是否可以用列表理解来重新创建它来做一些更具挑战性的事情。在

我已经知道了如何使用列表理解来扁平化子列表,但不是相反。有可能吗?在

def odd_even_filter(numbers):
    even = []
    odd = []
    for i in numbers:
        if i % 2 == 0:
            even.append(i)
        else:
            odd.append(i)
    return [even, odd]

odd_even_filter([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>[[2,4,6,7],[1,3,5,7,9]]

只是想看看我是否可以使用一个平面列表,并使用列表理解生成嵌套列表。这可能不值得,也不值得使用python方法,但只是进行试验。在


Tags: 函数列表filter事情evenodd计算机科学numbers
3条回答

这是可行的,一点也不容易阅读,但范围是子群的数目,2代表偶数和奇数。在

return [[ n for n in numbers if n % 2 == 0] if i == 0 else [ n for n in numbers if n % 2 != 0] for i in range(2)]

把它运行了一段时间,它需要的时间是预期的两倍。德夫努尔的回答也需要一点时间。在

^{pr2}$

在代码的可读性和简洁性之间总是有一个折衷的问题。在这种情况下,我相信devnull的答案是非常好的。他使用列表理解和Python if表达式,在一行中产生非常可读的内容。如果您的测试标准更严格,通常将条件分离成它们自己的函数会更有用。例如,这些将是:

def even(x): return x%2 == 0
def odd(x) : return x%2 != 0

然后使用它们过滤结果,如下所示:

^{pr2}$

这是三行代码,但组合起来非常可读。在

如果你的目标是最短的,但Python式的答案,如何?在

odd = [i for i in numbers if i % 2]  # this is O(n)
even = list(set(numbers) - set(odd)) # this is O(n log n)

一种效率低下但仍然清晰的替代方案是:

^{pr2}$

一个O(n)替代方案(最好的?)将是:

odd = [i for i in numbers if i % 2] # this is O(n)
even = [i for i in numbers if not i % 2] # this is O(n)

相关问题 更多 >