当前位置: 首页 > 面试题库 >

在Python中以对(current,next)的形式迭代列表

牟慎之
2023-03-14
问题内容

有时我需要在Python中迭代一个列表,以查看“当前”元素和“下一个”元素。到目前为止,我已经使用以下代码完成了此操作:

for current, next in zip(the_list, the_list[1:]):
    # Do something

这行得通,符合我的期望,但是有没有一种更惯用或有效的方式来执行相同的操作?


问题答案:

这是itertools模块文档中的一个相关示例:

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return zip(a, b)   

对于Python 2,你需要itertools.izip代替zip

import itertools
def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = itertools.tee(iterable)
    next(b, None)
    return itertools.izip(a, b)

工作原理:

首先,两个平行的迭代器,a和b被创建(在tee()呼叫),两者都指向原始迭代的第一个元素。第二个迭代器b向前移动了1个(next(b, None))调用。此时指向as0并b指向s1。双方a并b可以独立遍历原来迭代器-的izip函数接受两个迭代器,使对返回的元素,以相同的速度前进的两个迭代器。

一个警告:该tee()函数产生两个可以彼此独立进行的迭代器,但这要付出一定的代价。如果一个迭代器比另一个迭代器前进得更多,则tee() 需要将消耗的元素保留在内存中,直到第二个迭代器也将它们包括在内(它无法“倒回”原始迭代器)。这里没有关系,因为一个迭代器仅比另一个迭代器领先1步,但是通常使用这种方式很容易使用大量内存。

并且由于tee()可以接受n参数,因此它也可以用于两个以上的并行迭代器

def threes(iterator):
    "s -> (s0,s1,s2), (s1,s2,s3), (s2, s3,4), ..."
    a, b, c = itertools.tee(iterator, 3)
    next(b, None)
    next(c, None)
    next(c, None)
    return zip(a, b, c)


 类似资料:
  • 问题内容: 考虑: 因此,按预期方式,通过更改同一对象来处理迭代器。 在这种情况下,我希望: 跳过每第二个元素:对的调用应使迭代器前进一次,然后循环进行的隐式调用应使它第二次进行-并将第二次调用的结果分配给。 没有。该循环将打印列表中的 所有 项目,而不会跳过任何项目。 我的第一个想法是可能发生这种情况,因为循环调用了它所传递的内容,并且这可能会提供一个独立的迭代器-事实并非如此。 那么,为什么在

  • 问题内容: 问题很容易,我想遍历列表的每个元素和成对的下一个(将最后一个与第一个包裹在一起)。 我考虑过两种非Python的方法: 和: 预期输出: 关于这样做的更pythonic方式的任何建议?也许有一个我没有听说过的预定义功能? 同样,更一般的n折(三重奏,四重奏等代替对子)也可能很有趣。 问题答案: 我已经编写了元组通用版本的代码,我喜欢第一个版本,因为它非常简洁,我看的越多,对我的感觉就越

  • 首先,我认为下一种方式也可以接收司机的名字和姓氏: 但是文档表明,@joincolums仅适用于复合fk。请给我一个提示,我该怎么做需要的事情。

  • 我有一个名为的DataFrame想要迭代列表并获得的值,但我得到了以下错误(如预期的那样)。知道我该怎么取消吗?

  • 所以我做了一个简单的web应用程序,你输入一些文本,它就会显示在屏幕上,有点像聊天屏幕。 我的Python代码 我的HTML代码 日志和html都显示他们正在发送和接收数据。但是,它不打印的值,而是只打印。我很确定这是因为HTML文件。我肯定这可能是个新手犯的错误,但你知道怎么解决吗?

  • 问题内容: 在Python中迭代列表时,设置起始索引的最佳方法是什么。例如,我有一个星期几的列表-星期日,星期一,星期二,…星期六- 但我想从星期一开始遍历该清单。最佳做法是什么? 问题答案: 您可以使用切片: 这将从第三个元素开始,然后迭代到结束。