将数字串拆分为偶数和奇数整数的列表

mic*_*imo 6 python

有这样的代码

numbers = '1 2 3 4 5 6 7 8'
nums = {'evens': [], 'odds': []}

for number in numbers.split(' '):
    if int(number) % 2:
        nums['odds'].append(number)
    else:
        nums['evens'].append(number)
Run Code Online (Sandbox Code Playgroud)

如何在更少的线上完成相同的工作?

Wil*_*ill 6

短代码不是更好的代码.短代码不是更快的代码.短代码不是可维护的代码.现在,也就是说,让您的个人组件简洁明了是件好事.

这就是我要做的事情:

def split_odd_even(number_list):
    return {
        'odds': filter(lambda n: (n % 2) != 0, number_list),
        'evens': filter(lambda n: (n % 2) == 0, number_list)
    }

def string_to_ints(string):
    return map(int, numbers.strip().split())

numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))

print nums
Run Code Online (Sandbox Code Playgroud)

这给了我:

{'odds': [1, 3, 5, 7, 9], 'evens': [2, 4, 6, 8, 10]}
Run Code Online (Sandbox Code Playgroud)

虽然这段代码实际上已经添加了几行,但是程序正在做的事情变得更加清晰,因为我们已经应用了Abstraction并且使代码的每个组件只做了一件事.

尽管我们已经添加了两个函数,但代码中最可见的部分已经从这个:

numbers = '1 2 3 4 5 6 7 8'
nums = {'evens': [], 'odds': []}
for number in numbers.split(' '):
    if int(number) % 2:
        nums['odds'].append(number)
    else:
        nums['evens'].append(number)
Run Code Online (Sandbox Code Playgroud)

对此:

numbers = '1 2 3 4 5 6 7 8 9 10'
nums = split_odd_even(string_to_ints(numbers))
Run Code Online (Sandbox Code Playgroud)

通过读取这两行,我们知道numbers从字符串转换为ints 的列表,然后我们将这些数字拆分为奇数和偶数,并将结果分配给nums.

解释一些可能并不熟悉的事情:

  • map()list(或tuple其他可迭代的)中的每个项调用一个函数,并返回一个新列表,其中包含在每个项上调用的函数的结果.在这种情况下,我们使用它来调用int()列表中的每个项目.

  • filter()要求在每一个项目的功能list(或tuple或其他迭代),返回TrueFalse每个项目(当然,truthyfalsey),并返回评估,以项目列表True时,函数被调用.

  • Lambda Expressions(lambda)类似于"迷你函数",它们接受参数并可以就地创建.