Python 如何从嵌套循环中结束的位置中断和开始

Python 如何从嵌套循环中结束的位置中断和开始,python,loops,for-loop,nested-loops,Python,Loops,For Loop,Nested Loops,我想在一个列表上运行这个循环,它在我的a范围内搜索一个数字,直到在接下来的迭代中找到下一个数字,但是它会重新开始 这是我的密码 z = [30,84,126,135,137,179,242,342,426] c=[] for m in z: for i in range(1,1002, 7): if m in range(i, i+7): c.append(m%7) break elif m not in

我想在一个列表上运行这个循环,它在我的a范围内搜索一个数字,直到在接下来的迭代中找到下一个数字,但是它会重新开始

这是我的密码

z = [30,84,126,135,137,179,242,342,426]
c=[]
for m in z:
    for i in range(1,1002, 7):
        if m  in range(i, i+7):
            c.append(m%7)
            break
        elif m not in range(i, i+7):
            c.append(0)
print len(c) # outputs 246 

但是len(c)应该等于143,我该如何解决这个问题呢?

我想我知道你想做什么了,你最好的办法是改变你增加搜索范围的方式

z = [30,84,126,135,137,179,242,342,426]
c=[] # initialize results array
i = 1 # initialize i
for m in z: # for each item in list
    while 1: # perform this action until loop breaks
        if m in range(i, i+7): #if m is in range
            c.append(m%7)
            break #break the while loop, moving on to the next item
        elif m not in range(i, i+7):
            c.append(0) 
            i = i+7 #increment the search range, but do not break the loop

#Display results
print len(c)
print c
因此,在原始代码中,为数组
z
中的每个元素重置搜索范围
i
。这就是为什么您的
len(c)
值比预期值要高得多的原因。在我的代码中,当我遍历值数组时,我只在1到1002之间迭代一次

如果这不能解决您的问题,请告诉我,我能够匹配您描述的功能,但不是
len(c)
的预期输出。如果要获得预期值,可以更改代码以匹配以下内容:

z = [30,84,126,135,137,179,242,342,426]
c=[] # initialize results array
i = 1 # initialize i
for m in z: # for each item in list
    while i<1002: # perform this action until loop breaks
        if m in range(i, i+7): #if m is in range
            c.append(m%7)
            i = i+7
            break # break the while loop, moving on to the next item
        elif m in range(i-7, i):
            break
        else:
            c.append(0) 
            i = i+7 # increment the search range, but do not break the loop

while i<1002: # finish iterating i all the way up to 1002
    c.append(0) 
    i = i+7


#Display results
print len(c)
print c
z=[30,84126135137179242342426]
c=[]#初始化结果数组
i=1#初始化i
对于z中的m:#对于列表中的每个项目

当我时,我想我已经知道了你想要做什么,你最好的办法就是改变你增加搜索范围的方式

z = [30,84,126,135,137,179,242,342,426]
c=[] # initialize results array
i = 1 # initialize i
for m in z: # for each item in list
    while 1: # perform this action until loop breaks
        if m in range(i, i+7): #if m is in range
            c.append(m%7)
            break #break the while loop, moving on to the next item
        elif m not in range(i, i+7):
            c.append(0) 
            i = i+7 #increment the search range, but do not break the loop

#Display results
print len(c)
print c
因此,在原始代码中,为数组
z
中的每个元素重置搜索范围
i
。这就是为什么您的
len(c)
值比预期值要高得多的原因。在我的代码中,当我遍历值数组时,我只在1到1002之间迭代一次

如果这不能解决您的问题,请告诉我,我能够匹配您描述的功能,但不是
len(c)
的预期输出。如果要获得预期值,可以更改代码以匹配以下内容:

z = [30,84,126,135,137,179,242,342,426]
c=[] # initialize results array
i = 1 # initialize i
for m in z: # for each item in list
    while i<1002: # perform this action until loop breaks
        if m in range(i, i+7): #if m is in range
            c.append(m%7)
            i = i+7
            break # break the while loop, moving on to the next item
        elif m in range(i-7, i):
            break
        else:
            c.append(0) 
            i = i+7 # increment the search range, but do not break the loop

while i<1002: # finish iterating i all the way up to 1002
    c.append(0) 
    i = i+7


#Display results
print len(c)
print c
z=[30,84126135137179242342426]
c=[]#初始化结果数组
i=1#初始化i
对于z中的m:#对于列表中的每个项目

而我也许你想要的是一个
生成器

z=[30,84126135136137179242342426]
c=[]
def计数器(最大值,inc):#文件示例中的可重置生成器
i=1
而我<最大值:
val=(收益率i)
#如果提供了值,请更改计数器
如果val不是无:
i=val
其他:
i+=公司
ig=计数器(1002,7)
对于z中的m:
对于ig中的i:
#在同一范围内捕获多个NUM
如果m如果我也许你想要的是一个
生成器

z=[30,84126135136137179242342426]
c=[]
def计数器(最大值,inc):#文件示例中的可重置生成器
i=1
而我<最大值:
val=(收益率i)
#如果提供了值,请更改计数器
如果val不是无:
i=val
其他:
i+=公司
ig=计数器(1002,7)
对于z中的m:
对于ig中的i:
#在同一范围内捕获多个NUM
如果m如果我而
生成器似乎回答了这个问题,那么有一个更好的工具来解决这个编程问题:
itertools.groupby

from itertools import groupby


z = [1,2,3, 30,84,126,135,136,137,140,141,179,242,342,426]

g = dict([[k, [*g]] for k, g in groupby(z, key=lambda x: (x-1)//7)])

d = [((tuple(g[i]) if len(g[i]) > 1 else g[i][0]) if (i in g) else 0)
     for i in range(0, 143)]
针对我的第一个答案的代码运行:(请使用相同的
z
,它已被更改)

查看itertools.groupby的匹配程度查看dict包装的groupby结果:

g
Out[279]: 
{0: [1, 2, 3],
 4: [30],
 11: [84],
 17: [126],
 19: [135, 136, 137, 140],
 20: [141],
 25: [179],
 34: [242],
 48: [342],
 60: [426]}

(以上在3.6中起作用,
[*g]
字典键
测试
(i在g中)
在2.7中可能不同)

虽然
生成器
似乎回答了这个问题,但有一个更好的编程工具:
itertools.groupby

from itertools import groupby


z = [1,2,3, 30,84,126,135,136,137,140,141,179,242,342,426]

g = dict([[k, [*g]] for k, g in groupby(z, key=lambda x: (x-1)//7)])

d = [((tuple(g[i]) if len(g[i]) > 1 else g[i][0]) if (i in g) else 0)
     for i in range(0, 143)]
针对我的第一个答案的代码运行:(请使用相同的
z
,它已被更改)

查看itertools.groupby的匹配程度查看dict包装的groupby结果:

g
Out[279]: 
{0: [1, 2, 3],
 4: [30],
 11: [84],
 17: [126],
 19: [135, 136, 137, 140],
 20: [141],
 25: [179],
 34: [242],
 48: [342],
 60: [426]}

(以上在3.6中起作用,
[*g]
字典键
测试
(i在g中)
在2.7中可能不同)

那么为什么要
中断
?因为即使在找到数字后,它仍会继续在以下范围内搜索该数字,在这种情况下,len(c)变为1287最简单的方法是将内部for循环提取到方法。那么循环就不会嵌套,也就不会混淆你要打破的是哪一个循环我不明白如果它打破并重新开始,为什么它不是从我结束的地方开始的,你能说明更多吗!?那么为什么要断开
?因为即使在找到数字后,它仍会继续搜索以下范围内的数字,在这种情况下,len(c)变为1287最简单的方法是将内部for循环提取到一个方法。那么循环就不会嵌套,也就不会混淆你要打破的是哪一个循环我不明白如果它打破并重新开始,为什么它不是从我结束的地方开始的,你能说明更多吗!?非常感谢,但不是我想要的输出透镜(c)如果再次等于143,列表中的零的数目似乎有问题,你知道我还可以尝试什么吗?第一个解更好,但它在列表中的最后一个数之后停止。我如何使它继续到1002,这是我的范围的结束呢WAS69是最接近的,但它需要继续到1002这一个得到了最多的值看看c是如何[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,