我有代码风格问题,我正在寻找下面写的pythonic实现。
我发布的(简化)代码遍历序列并返回范围。每个范围以特定条件开始和结束。范围不能重叠。我使用变量active
来跟踪是否已找到范围的开头。如果在序列结束时,活动范围尚未关闭,则应添加(使用input_length
作为结束索引)
下面的代码按预期工作,但我不喜欢我必须编写代码以将范围附加到结果列表两次的事实。在我遇到的实际问题中,这个块更长,我不想在for循环之后第二次写它。
您对我如何改善这一点有什么建议吗?
谢谢!
input_length = 100
results = []
active = False
start = None
for i in range(input_length):
condition = i % 9 == 0
if not active and condition:
active = True
start = i
condition2 = i % 13 == 0
if active and condition2:
active = False
# do some additional calculations...
results.append((start, i))
if active:
# do some additional calculations...
results.append((start, input_length))
print(active)
print(results)
答案 0 :(得分:1)
简单的方法是编辑内部条件:
condition2 = i % 13 == 0
if active and (condition2 or i == input_length-1))
active = False
# do some additional calculations...
results.append((start, i if condition2 else i + 1))
并删除外部。
如果你想避开i if condition2 else i + 1
,你可以在range(input_length + 1)
上进行迭代? (这取决于你在循环中做了什么其他事情)
答案 1 :(得分:0)
我找到了一个很好的方法:
import itertools as it
il = 100
results = []
def fun1():
active = False
start = None
for i in range(il):
condition = i % 9 == 0
if not active and condition:
active = True
start = i
condition2 = i % 13 == 0
if active and condition2:
active = False
# do some additional calculations...
results.append((start, i))
if active:
# do some additional calculations...
results.append((start, il))
return results
def fun2():
a=b=0
while b<il:
yield (a,b)
b=b+13
a=a+9
while a<=b-13:
a=a+9
if a<il:
yield (a,il)
print fun1()
print
print [(a,b) for (a,b) in fun2()]
请在代码中查看il的不同值,并在使用之前将其与您的功能进行比较。