- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
这是一个关于使用标准库但晦涩难懂(至少对我而言)的快速代码与手动替代方案相比的相对优点的问题。在这个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/
我有一个数组列表: ArrayList allText = new ArrayList(); 其内容是这样的: [Alabama - Montgomery, Alaska - Juneau, Ariz
我有一个 timestamp 格式的开始和结束时间。我想将它们分成多个时间段,例如 1 小时。 $t1 = strtotime('2010-05-06 12:00:00'); $t2 = strtot
我需要将 span10 分成 3 列,但我无法将它们排列起来。我应该在 span10 中添加一个 span12 还是使用 offset 还是??
我有一个时间序列。我想从早上 8 点到第二天早上 7:59 分成 24 小时的区 block 。我知道如何按日期分组,但我尝试过使用 TimeGroupers 和 DateOffsets 处理这个 8
我收到“街道号码邮政编码城市”形式的地址(作为字符串)。我想要做的是将街道和号码与邮政编码和城市分开。通常你可以按空格分割。但有些街道名称中也有空格,例如:“Emile Van Ermengemlaa
我有一个用户列表。其中一些用户处于第一状态,而其他用户处于第二状态。所以我想要的是将这个列表显示为首先,它按排序顺序显示存在 = 1 的用户,然后按排序顺序显示存在 = 2 的用户。这里的排序是根据用
我感觉我搜索了整个网络,但找不到一种方法将不同高度的 div 很好地划分为 3 列,就像 http://www.ing.nl 上那样 headertekst headerteksttesth
Bootstrap 3 按钮下拉菜单出现问题。你可以在这里看到我的两个例子: http://www.bootply.com/W1dLusilMk http://www.bootply.com/GGBv
我在 php 中执行以下操作 foreach($QuestionAsekd as $k => $v){ $grp_name = $v['NAME']; $groupValues[$gr
我找到了一种用pandas解析html的绝妙方法。我的数据格式有点奇怪(见下文)。我想将这些数据拆分为 2 个单独的数据帧。 注意每个单元格如何由,分隔...是否有任何真正有效的方法来分割所有这些单元
HTML 看起来像这样,但我不允许对其进行更改。我只能编写 CSS 将其变成 2 列。 Povezave www.behance.net www.kiberpipa.org www.o
假设我有以下数据框“A” utilization utilization_billable service 1
我需要将 2 个文本框拉伸(stretch)到 100% 的浏览器宽度,以及一个提交按钮。所有三个都应该在一行中,我试图拉伸(stretch)它但它没有发生......有什么想法吗? 代码: .sea
我是一名优秀的程序员,十分优秀!