python外循环从内循环继续
Posted
技术标签:
【中文标题】python外循环从内循环继续【英文标题】:python outer loop to continue from inner loop 【发布时间】:2013-01-31 16:52:59 【问题描述】:1我正在遍历一系列数字以查找数字范围(例如
例如: 列表 = [1, 2, 3, 125, 7, 8, 9, 200]。 我想进入一个文件:1-3、7-9。 我面临的问题是外循环会重复内循环中的项目,所以我得到的输出是:1-3、2-3、3、7-9、8-9、9。
我目前有效的策略:
counter = 1
for i in range(len(list)): # outer loop
if counter > 1: # prevents the outer loop from iterating the numbers iterated in inner loop
counter -= 1
continue
elif counter <=1:
while list[i] < 100:
i +=1
counter +=1
if list[i] > 100:
print list[i-counter], '-', list[i]
break
我想知道是否有更 Pythonic 的方式让外循环跳过已在内循环中迭代的项目,而不是使用额外的计数器(就像我在上面所做的那样)。谢谢。
编辑:很少有回复关注连续数字。我的错误,数字不必是连续的。我只需要该范围内的第一个和最后一个数字 例如。列表 = [1,4,8, 12, 57, 200, 4,34, 300]。输出:1 - 57、4 - 34。 列表和标准取决于用户。条件将始终是带有比较运算符“
【问题讨论】:
【参考方案1】:您不需要两个循环。一个就足够了:
def ranges(seq):
it = iter(seq)
start = end = next(it)
for val in it:
if val == end + 1:
end = val
else:
if end - start > 1:
yield start, end
start = end = next(it)
for start, end in ranges([1, 2, 3, 125, 7, 8, 9, 200]):
print('%d-%d' % (start, end))
逻辑与您的稍有不同:它查找由连续数字组成的子序列(在您的示例中为1 2 3
和7 8 9
)。如果需要,可以轻松更改逻辑以在任意编号 >= 100
处也中断序列。
【讨论】:
感谢您的回复,我还在努力解决。我还添加了有关我的问题的其他信息,您的建议仍然有效吗? 我试过这个方法,它非常适合我需要的东西。第二个问题,我还需要列表中项目的位置。有没有一种快速的方法来获取“开始”和“结束”的索引值?谢谢【参考方案2】:另一种方法,基于 while 循环:
def print_ranges(given_list, limit):
while given_list:
start = end = given_list.pop(0)
if start < limit:
while given_list and (given_list[0] < limit):
end = given_list.pop(0)
if (end != start):
print "%d-%d"%(start,end) # or save it in another list
一些测试:
>>> print_ranges([1,4,8, 200, 4,34, 72, 300], 100)
1-8
34-72
>>> print_ranges([1, 4, 8, 12, 57, 200, 4, 34, 300], 100)
1-57
4-34
>>> print_ranges([1, 4, 8, 12, 57, 200, 4, 34, 300], 250)
1-34
【讨论】:
抱歉排序不是一个选项。我没有在我的原始帖子中提到列表中项目的位置也很重要,并且将被输出。其实我不太清楚你的建议是否符合我的需要。标准(例如 好的,没关系,它真的是可选的...我添加它是为了完整性和未来的读者。 :) @jonoave 我已经编辑了我的答案并添加了 end 谢谢,您的更改现在更有意义了,我会尝试看看它是否符合我的需要。 @jonoave 现在更清楚了,所以我稍微更改了代码以适合您的第二个示例。如果您愿意,可以用变量(由用户提供)替换 100【参考方案3】:使用zip()
:
zip(lis,lis[1:])
返回类似:
[(0, 1),
(1, 2),
(2, 3),
(3, 5),
(5, 6),...]
现在您可以遍历此列表以检查差异是否为 1。
代码:
In [103]: def ranges(lis):
ans=[]
z=zip(lis,lis[1:])
for x,y in z:
if y-x==1:
ans.extend([x,y])
else:
if ans:
yield "0-1".format(min(ans),max(ans))
ans=[]
if ans:
yield "0-1".format(min(ans),max(ans))
.....:
In [104]: lis=[0,1,2,3,5,6,7,8,10,11,2,3,4]
In [105]: list(ranges(lis))
Out[105]: ['0-3', '5-8', '10-11', '2-4']
【讨论】:
以上是关于python外循环从内循环继续的主要内容,如果未能解决你的问题,请参考以下文章