扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:开发者在线 来源:开发者在线 2007年8月2日
关键字:
实现该函数的一种方法可以是遍历各个值,记录前一个值并且如果前一个值与当前值相等的将它添加到子列表中。第一次编写的代码可能如下所示:
def pack(seq):
results = []
temp = []
last = None
for current in seq:
if current == last:
temp.append(current)
else:
results.append(temp)
temp = [current]
last = current
results.append(temp)
return results
工作很好,让我们看一下它有多快。
>>> i = time.clock(); q = pack(long); print time.clock()-i
17.34
看起来不是太好,我们可以像处理压缩函数以一样将所有工作移到一个铁代工具中的函数中实现吗?下面是使用groupby函数的实现,它返回一个tuple其中包含了列表中每个项目的第一个值忽略重复的情况(像压缩函数一样)以及一个列表其中包含了所有连续的重复值(像打包pack函数一样。因此我们可以只要tuple的后半部分。
def pack2(l):
return [list(group) for name, group in groupby(l)]
当我们运行它时:
>>> i = time.clock(); q = pack2(long); print time.clock()-i
36.41
这更糟糕,因为我们做这些额外工作并将它们抛弃一边。我们真正想要做的是使用已经编写好的压缩函数,因为我们知道它的速度很快。
def pack3(seq):
it = iter(seq)
return [list(takewhile(lambda y: y==x, it))+[x] for x in compress3(seq)]
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者