在for循环中迭代两个区间

17

我有几个像这样的简单循环:

for i in range (30, 52):

    #do some stuff here

for i in range (1, 18):

    #do some more stuff

我希望能够使用以下语法将这个过程压缩成一个循环:

for i in range((30, 52), (1, 18):

    #do some stuff

我意识到这个语法不会起作用,但这是我所需要的基本概念。我见过人们使用zip同时迭代两个范围,但这不是我所需要的。

有什么想法吗?


使用 itertools.chain.from_iterable 将它们链接起来。 - Ashwini Chaudhary
@AshwiniChaudhary 您好,感谢您的回复。您能详细说明一下语法吗?谢谢。 - gdogg371
@AshwiniChaudhary 我想“product”是 OP 正在寻找的吗? - Mazdak
@Kasra 他们有单独的循环,而不是嵌套的循环,所以... - Ashwini Chaudhary
@AshwiniChaudhary 是的,似乎是这样! - Mazdak
4个回答

27

来自https://docs.python.org/2/library/itertools.html#itertools.chain:

创建一个迭代器,它从第一个可迭代对象中返回元素,直到该对象用尽,然后继续到下一个可迭代对象,直到所有可迭代对象都用尽。用于将连续的序列视为单个序列。

示例:

import itertools as it
for i in it.chain(range(30, 52), range(1, 18)):
    print(i)

对于Python 3

你可以将两个范围一起循环

示例:

import itertools as it
for i, x in it.zip_longest(range(30, 52), range(1, 18)):
    print(i, x)

那个完美地运作了。非常感谢。我会在8分钟内接受! - gdogg371
只是提醒:由于提供了优化的 C 实现,因此“itertools”可以提供更好的性能,其中包括几个常见函数,其速度可能比它们纯Python等效函数快。 - Rupesh Bhurke

9
你可以将你的两个范围迭代器转换为列表,然后使用加法将它们组合起来:
for i in list(range(30, 52)) + list(range(1, 18)):
    # something

0
for i, j in zip(range(30, 52), range(1, 18)):
    print(i, j)

2
回答需要支持信息 您的回答可以通过提供更多的支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便他人可以确认您的回答是否正确。您可以在帮助中心找到关于如何撰写良好回答的更多信息。 - moken

-1
for i in range(30, 52) + range(1, 18):
    #something

3
虽然这段代码可能回答了问题,但是提供关于为什么或者如何回答问题的额外背景信息可以增加它的长期价值。 - Maximilian Peters
1
似乎在range之间不允许使用+操作符。 - decadenza

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