多次遍历列表

4
我希望能够多次遍历一个列表。比如说:
mylist = [10,2,58]

for i in iterate_multiple_times(mylist, 3):
    print(i)

应该输出:
10
2
58
10
2
58
10
2
58
  • 列表内容很长,为了缩进或样式的目的我不想创建嵌套的for循环。
  • 从辅助存储的角度来看,是否有比下面更好的解决方案呢?
from itertools import chain, repeat

for i in chain.from_iterable(repeat(mylist, 3)):
    print(i)

3
为什么不使用嵌套的 for 循环? - Ma0
可能是R函数rep()在Python中的重复元素列表/向量的重复问题。 - Richard Inglis
那么 while i in range(len(mylist)*3)obj = mylist(i%3) 怎么样? - Ma0
3
repeatchain.from_iterable 都是惰性的,你不会创建整个列表的副本。 - Caleth
@Ev.Kounis,你有一堆错误...mylist(i%3)while i in range(...) - Aran-Fey
@Aran-Fey 不好意思,脑抽了。我是指 mylist[i%3]while i < 3*len(mylist) - Ma0
3个回答

4
你可以在生成器表达式中使用嵌套的for循环:
>>> mylist = [10, 2, 58]
>>> for i in (x for _ in range(3) for x in mylist):
...     print(i)

1
虽然这个解决方案使用了嵌套的for循环,但它可能是最好的答案。它简单且内存效率高。 - mhawke
我认为 OP 需要在我点赞之前澄清“为什么不使用嵌套的 for 循环”,否则这只是对一个不明确问题的可能解决方案。 - jpp
@vaultah。没错,但这意味着(在我看来)是个矛盾修辞。缩进和风格并不互斥。事实上,可以说缩进是好的风格!如果您在回答前加上“缩进是好的”,我会点赞! - jpp

-1
不,你已经做得很好了。无论是repeat还是chain.from_iterable都是惰性的,你不会创建整个列表的副本。如果你多次使用它,你可能想将其提取到一个单独的函数中。
请参见Itertools Recipes
def ncycles(iterable, n):
    "Returns the sequence elements n times"
    from itertools import chain, repeat
    return chain.from_iterable(repeat(iterable, n)) 
    # the general recipe wraps iterable in tuple()
    # to ensure you can walk it multiple times
    # here we know it is always a list

mylist = [10,2,58]

for i in ncycles(mylist, 3):
    print(i)

@mhawke 是的,但是没有想到把它提取到一个函数中。 - Caleth
将OP的代码放入一个函数中并不是一个真正的答案。 - mhawke
我认为将问题中的代码作为答案重新发布是有效的,因为它是一个非常好的解决方案 - 比其他大多数已发布在其他答案中的解决方案都要好。但你应该解释一下为什么这是一个好的解决方案。可以添加类似于“您已经使用了最少量的辅助存储器的代码。改进它的一种方法是将其包装在一个函数中。”这样的语句。 - Aran-Fey

-4

除了使用itertools原语外,您还可以对列表进行乘法操作:

for i in mylist * 3: print(i)

或创建自己的过程:

def mul(iterable, amount):
   while amount > 0:
      for x in iterable: yield x
      amount -= 1

恐怕标准库/内置函数中没有太多内容。


这不是Pythonic的方式吗?而且,天真的生成器(以及任何其他天真的重复解决方案)只要我们替换任何其他单次运行的可迭代对象,就会崩溃。 - bipll
你的代码也不能与单次迭代器一起使用... 你不能将其作为参数使用。 - Aran-Fey
是的,这就是为什么我称它为“naive”生成器的原因。 - bipll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接