有这样的代码
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)
如何在更少的线上完成相同的工作?
答案 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
或其他可迭代)中的每个项调用一个函数,该函数返回True
或False
每个项目(好,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(' ')]