- 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/
itertools.repeat(n) 和 itertools.cycle(n) 有区别吗?看起来,它们产生相同的输出。在我需要某个元素的无限循环的情况下,使用一种更有效吗? 最佳答案 简单地说,it
在编写一个查找列表中所有不同组合的程序时,我发现了很多关于使用 intertools.product() 而不是 intertools.combinations_with_replacement()
这段代码: from itertools import groupby, count L = [38, 98, 110, 111, 112, 120, 121, 898] groups = group
我正在读取一个文件(同时执行一些昂贵的逻辑),我需要在不同的函数中迭代多次,所以我真的只想读取和解析文件一次。 解析函数解析文件并返回一个itertools.groupby对象。 def parse_
下面是一些关于itertools.tee的测试: li = [x for x in range(10)] ite = iter(li) ========================
为什么下面的工作: from itertools import chain 但下面的不是吗? import itertools.chain as chain 最佳答案 import foo.bar 语
我必须在列表中生成所有 2 对项目组合。现在,我知道有两种方法可以实现此目的:嵌套 for 循环和 python 的内置 itertools: from itertools import combin
给定 r 为 4 的 itertools 组合: from itertools import combinations mylist = range(0,35) r = 4 combinationsl
我有一个列表 = [1, 2, 3, 3, 6, 8, 8, 10, 2, 5, 7, 7]我正在尝试使用 groupby 将其转换为 1 2 3 3 6 8,8 10 2, 5 7,7 基本上,任何
我正在使用itertools对字典键进行分组,使用以下内容: host_data = [] for k,v in itertools.groupby(temp_data, key=lambda x:x
我将自定义函数保存在一个单独的模块中,以便在需要时调用。我的一个新函数使用 itertools,但我不断收到名称错误。 NameError: name 'itertools' is not defin
我有一个简单的 python 函数来执行 itertools 乘积函数。如下所示。 def cart(n, seq): import itertools b = 8 while
我正在创建大量带有替换(乘积)的排列,它需要大量的计算时间。让我们使用像这样的简单函数: def permutations(li): return [p for p in itertools.
我编写了以下代码,使所有 20 个字符长的字符串都包含 A、T、G 和 C 的组合。 但是,我想避免连续出现 3 个以上的相同字符,因此我添加了一个 if 函数来检查这一点。问题是,这是在 itert
我想要一个函数来生成任意数量的数组的叉积。 # Code to generate cross product of 3 arrays M = [1, 1] N = [2, 3] K = [4, 5]
这个问题已经有答案了: Cartesian Product of Sets where No Elements are Identical under Permutations in Python (
我使用 for num in Combinations(nums[0], number): 返回列表中数字的所有组合,其中 num = len(nums[0])- 1.. 我想做的是作为单独的变量返回
我想将 itertools.count 元素作为列表索引传递,但会导致以下错误: TypeError: list indices must be integers or slices, not ite
有没有更好的方法来列出所有可能的组合,并用每个元素的最小和最大出现次数进行替换,而不是(1)使用itertools.combinations_with_replacement()列出所有可能的组合,而
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 6 年前。 Improve th
我是一名优秀的程序员,十分优秀!