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

时间:2016-07-19 07:21:02

标签: 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)

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

6 个答案:

答案 0 :(得分:5)

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

这就是我要做的事情:

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

这给了我:

{'odds': [1, 3, 5, 7, 9], 'evens': [2, 4, 6, 8, 10]}

虽然这段代码实际上已经添加了几行,但是我们已经应用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)

对此:

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

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

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

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

  • filter()list(或tuple或其他可迭代)中的每个项调用一个函数,该函数返回TrueFalse每个项目(好,truthy or falsey),并在调用函数时返回评估为True的项目列表。

  • Lambda表达式(lambda)就像"迷你函数"带参数并可以就地创建。

答案 1 :(得分:4)

功能性方法:

>>> numbers = '1 2 3 4 5 6 7 8'
>>> numbers = map(int, numbers.split())
>>> nums = {'evens': filter(lambda x: x%2 == 0, numbers), 'odds': filter(lambda x: x%2 != 0, numbers)}
>>> nums
{'evens': [2, 4, 6, 8], 'odds': [1, 3, 5, 7]}

答案 2 :(得分:3)

您可以使用itertools.groupby完成相同的结果,如下所示:

>>> from itertools import groupby
>>>
>>> numbers = '1 2 3 4 5 6 7 8'
>>> d = {'even':[], 'odd':[]}
>>> mynum = [int(x) for x in numbers.strip().split()]
>>> for k,g in groupby(mynum, lambda x: x % 2):
        if k:
            d['odd'].extend(g)
        else:
            d['even'].extend(g)


>>> d
{'even': [2, 4, 6, 8], 'odd': [1, 3, 5, 7]}

答案 3 :(得分:1)

numbers = '1 2 3 4 5 6 7 8'
nums = {}
nums["even"] = [int(i) for i in numbers.split() if int(i) % 2 == 0]
nums["odd"] = [int(i) for i in numbers.split() if int(i) % 2 == 1]
print(nums)

输出:

{'even': [2, 4, 6, 8], 'odd': [1, 3, 5, 7]}

答案 4 :(得分:1)

如果您只想尝试一下:

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

但是如果你想在制作中使用它:可读代码比'短'代码更重要

答案 5 :(得分:0)

你可以做一个单行,但我不推荐它。你的代码非常好。

[nums['odds'].append(n) if int(n)%2 else nums['evens'].append(n) for n in numbers.split(' ')]