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

在Python中以列表形式(循环方式)遍历对

督建柏
2023-03-14
问题内容

问题很容易,我想遍历列表的每个元素和成对的下一个(将最后一个与第一个包裹在一起)。

我考虑过两种非Python的方法:

def pairs(lst):
    n = len(lst)
    for i in range(n):
        yield lst[i],lst[(i+1)%n]

和:

def pairs(lst):
    return zip(lst,lst[1:]+[lst[:1]])

预期输出:

>>> for i in pairs(range(10)):
    print i

(0, 1)
(1, 2)
(2, 3)
(3, 4)
(4, 5)
(5, 6)
(6, 7)
(7, 8)
(8, 9)
(9, 0)
>>>

关于这样做的更pythonic方式的任何建议?也许有一个我没有听说过的预定义功能?

同样,更一般的n折(三重奏,四重奏等代替对子)也可能很有趣。


问题答案:

我已经编写了元组通用版本的代码,我喜欢第一个版本,因为它非常简洁,我看的越多,对我的感觉就越像Pythonic
…毕竟,比带zip的衬里更像Pythonic ,星号参数扩展,列表推导,列表切片,列表串联和“范围”?

def ntuples(lst, n):
    return zip(*[lst[i:]+lst[:i] for i in range(n)])

即使对于大型列表,itertools版本也应足够高效…

from itertools import *
def ntuples(lst, n):
    return izip(*[chain(islice(lst,i,None), islice(lst,None,i)) for i in range(n)])

以及用于不可索引序列的版本:

from itertools import *
def ntuples(seq, n):
    iseq = iter(seq)
    curr = head = tuple(islice(iseq, n))
    for x in chain(iseq, head):
        yield curr
        curr = curr[1:] + (x,)

无论如何,谢谢大家的建议!:-)



 类似资料:
  • 问题内容: 我有一个具有1 2 3 4 5值的数组。 现在我想以循环方式遍历它。像我想打印2 3 4 5 1或3 4 5 1 2或5 1 2 3 4等等。有什么 算法 吗? 编辑: 我想以循环方式打印所有组合。我不想在初始阶段说明起点。 问题答案: (如果要从向下迭代数组,请在数组下标表达式中更改为。) 我应该注意,就执行速度而言,这可能不是表达循环的最有效方法。但是,差异很小,并且 很可能无关紧

  • 问题内容: 以下是提供输出的代码段:。由于访问列表中的数字3,我期望获得输出。在线给出的解释是“每次迭代中更改的价值”,但我不太了解如何或为什么。任何解释都很好! 问题答案: 这里发生的是一个列表在循环过程中发生了变异。 让我们考虑以下代码片段: 输出为: 每次迭代: 从内部指针当前指向的位置读取值 立即将其分配给列表中的最后一个元素 在最后一个元素打印在标准输出上之后 就像这样: 内部指针指向第

  • 问题内容: 有时我需要在Python中迭代一个列表,以查看“当前”元素和“下一个”元素。到目前为止,我已经使用以下代码完成了此操作: 这行得通,符合我的期望,但是有没有一种更惯用或有效的方式来执行相同的操作? 问题答案: 这是模块文档中的一个相关示例: 对于Python 2,你需要代替: 工作原理: 首先,两个平行的迭代器,a和b被创建(在tee()呼叫),两者都指向原始迭代的第一个元素。第二个迭

  • 本文向大家介绍php中遍历二维数组并以表格的形式输出的方法,包括了php中遍历二维数组并以表格的形式输出的方法的使用技巧和注意事项,需要的朋友参考一下 一.索引数组 输出效果 二.关联数组(不能用for循环) 输出效果: 注意:1.关联数组不能直接用for循环       2.创建表格时 表,行,列的代码都是成对存在的,不要漏掉,不要忘记加斜杠 /     3.能用双引号时尽量用双引号,尤其是录入

  • 问题内容: 我有一个这样的清单清单。 现在,我需要遍历上面的列表并输出一个字符串列表,如下所示(原始列表中没有数字) 问题答案: 准确执行您指定的操作的最简单解决方案是: 这基本上等效于迭代版本: 但是,这并不是遍历具有任意维数的多维列表的通用方法,因为嵌套列表推导/嵌套的for循环可能很难看。但是,对于2或3维列表,您应该放心。 如果您确实决定需要平整3个以上的尺寸,我建议实现一个递归遍历函数,

  • 问题内容: 因此,我以为我可以像普通对象一样遍历localStorage,因为它具有长度。我该如何循环? 如果我这样做,则返回正确。所以我认为循环会起作用。 我在想类似的东西: 但无济于事。有任何想法吗? 我的另一个想法是 在其中工作。 问题答案: 您可以使用该方法。 返回第一个键(顺序是实现定义的,但是在您添加或删除键之前是恒定的)。 如果顺序很重要,则可以存储JSON序列化数组: 规范草案声称