这是一个关于使用标准库的快速代码的相对优点的问题,但是对于手动的替代方案而言是模糊的(至少对我而言).在这个线程(以及它复制的其他线程)中,似乎将列表分成组的"Pythonic"方法是使用itertools,如下面的代码示例中的第一个函数(稍微从ΤΖΩΤΖΙΟΥ修改).
我更喜欢第二个功能的原因是我可以理解它是如何工作的,如果我不需要填充(将DNA序列转换成密码子,比方说),我可以立即从内存中重现它.
itertools的速度更快.特别是如果我们不希望列表返回,或者我们想要填充最后一个条目,则itertools会更快.
还有哪些其他参数支持标准库解决方案?
from itertools import izip_longest
def groupby_itertools(iterable, n=3, padvalue='x'):
"groupby_itertools('abcde', 3, 'x') --> ('a','b','c'), ('d','e','x')"
return izip_longest(*[iter(iterable)]*n, fillvalue=padvalue)
def groupby_my(L, n=3, pad=None):
"groupby_my(list('abcde'), n=3, pad='x') --> [['a','b','c'], ['d','e','x']]"
R = xrange(0,len(L),n)
rL = [L[i:i+n] for i in R]
if pad:
last = rL[-1]
x = n - len(last)
if isinstance(last,list):
rL[-1].extend([pad] * x)
elif isinstance(last,str):
rL[-1] += pad * x
return rL
Run Code Online (Sandbox Code Playgroud)
定时:
$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools; L = list("abcdefghijk")' 'groupby_my(L)'
100000 loops, best of 3: 2.39 usec per loop
$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools; L = list("abcdefghijk")' 'groupby_my(L[:-1],pad="x")'
100000 loops, best of 3: 4.67 usec per loop
$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools; L = list("abcdefghijk")' 'groupby_itertools(L)'
1000000 loops, best of 3: 1.46 usec per loop
$ python -mtimeit -s 'from groups import groupby_my, groupby_itertools; L = list("abcdefghijk")' 'list(groupby_itertools(L))'
100000 loops, best of 3: 3.99 usec per loop
Run Code Online (Sandbox Code Playgroud)
编辑:我会在这里更改函数名称(请参阅Alex的答案),但有很多我决定发布此警告.
Ale*_*lli 15
当您重复使用标准库中的工具时,而不是通过自己编写代码来"重新发明轮子",您不仅要获得经过良好优化和调优的软件(有时令人惊讶地如此,通常在itertools组件的情况下):更多重要的是,你获得了大量的功能,你不必自己测试,调试和维护 - 你正在利用许多为标准库做出贡献的出色程序员的测试,调试和维护工作!
因此,了解标准库为您提供的内容的投资很快就能自我回报 - 并且您将能够"重现内存"以及重新发明的代码,实际上可能更好重用量.
顺便说一下,对于大多数程序员来说,术语"group by"具有明确定义的惯用含义,这要归功于它在SQL中的使用(以及itertools它本身的类似用法):因此我建议你避免将它用于完全不同的东西 -这种情况只会在你与其他人合作的时候产生混乱(希望经常,因为独奏的鼎盛时期,"牛仔"程序员早已不复存在 - 另一个支持标准和反对车轮改造的论据;-).
最后,您的docstring与您的函数的签名 - arguments-order错误;-)不匹配.
学习Python基础知识所花费的时间将在以后得到回报.因此,学习itertools,以及groupby如何工作.使用itertools不仅比任何手动解决方案更快,它还可以帮助您在将来编写更好的代码.