gpt4 book ai didi

Python:使用 itertools 将列表拆分为组的参数

转载 作者:太空狗 更新时间:2023-10-30 00:22:36 27 4
gpt4 key购买 nike

这是一个关于使用标准库但晦涩难懂(至少对我而言)的快速代码与手动替代方案相比的相对优点的问题。在这个thread (以及它重复的其他方法),将列表拆分为组的“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

时间:

$ 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

编辑:我会在这里更改函数名称(请参阅 Alex 的回答),但有太多我决定改为发布此警告。

最佳答案

当您重用标准库中的工具,而不是通过自己从头开始编写代码来“重新发明轮子”时,您不仅会获得经过良好优化和调整的软件(有时令人惊讶的是,在 itertools components):更重要的是,你获得了大量的功能,你不必自己测试、调试和维护——你正在利用许多人的所有测试、调试和维护工作为标准库做出贡献的杰出程序员!

因此,在了解标准库为您提供什么方面的投资会迅速得到返回,而且返回很多倍——您将能够“从内存中重现”,就像重新发明轮子代码一样,确实可能更好,谢谢到更高的重用量。

顺便说一句,由于它在 SQL 中的使用(以及在 itertools 本身中的类似用法),术语“分组依据”对于大多数程序员来说具有明确定义的惯用含义:因此,我会建议您避免将它用于完全不同的事情——这只会在您与其他任何人合作时造成困惑(希望经常,因为独奏的鼎盛时期,“牛仔”程序员早已不复存在——另一个支持的论点标准和反对轮子重新发明;-).

最后,您的文档字符串与函数的签名不匹配——参数顺序错误;-)。

关于Python:使用 itertools 将列表拆分为组的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2095637/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com