基于动态列表python的for循环

基于动态列表python的for循环,python,for-loop,conditional,Python,For Loop,Conditional,编辑: 该程序的预期行为是找到具有增加趋势的数字序列,因此我想从ks列表生成如下列表: desiredList=[[97122]、[98111]、[98101103103104] 我有以下几点,我的目标是根据列表的长度运行for循环,列表的长度在for循环本身内部改变。Python只考虑for循环之前的长度,当列表的长度在循环中更改时,它仍然采用循环之前的旧值。代码如下: ks=[97,122,111,98,111,98,101,103,103,104,97] splitLine=2 count

编辑: 该程序的预期行为是找到具有增加趋势的数字序列,因此我想从
ks
列表生成如下列表:
desiredList=[[97122]、[98111]、[98101103103104]

我有以下几点,我的目标是根据列表的长度运行for循环,列表的长度在for循环本身内部改变。Python只考虑for循环之前的长度,当列表的长度在循环中更改时,它仍然采用循环之前的旧值。代码如下:

ks=[97,122,111,98,111,98,101,103,103,104,97]
splitLine=2
counter=[]
for i in range(0,len(ks)):
   a=ks[i:splitLine]
   while len(a)>1:
        for j in range(0,len(a)):
            m=j
            n=j+1
            if(a[m]-a[n]<=0):
                c=c+1
                k=splitLine+c-1
                a.append(ks[k]) #When append happens, the for loop still takes the older value of len(a) instead of new value
            else:
                a.pop(-1)
                counter.append(a)
                splitLine=splitLine+1
                a=[]
                break
ks=[97122111,98111,98101103104,97]
splitLine=2
计数器=[]
对于范围(0,len(ks))内的i:
a=ks[i:分割线]
而len(a)>1:
对于范围(0,len(a))内的j:
m=j
n=j+1

如果(a[m]-a[n]循环问题的快速解决方法是在
循环时将
换成
换成
。更改此选项:

for j in range(0,len(a)):
    # <loop contents>
范围(0,len(a))内的j的
:
# 
为此:

j = 0
while j < len(a):
    # <loop contents>
    j += 1
j=0
而j
for
循环正在获取
j
范围之外的值(Python 2中是
list
,Python 3中是generator对象)。该
range
是在第一次运行
for
循环时计算出来的;无论您对
a
做了什么,之后它都不会更新


while
循环在这种情况下为您提供了更多的控制,因为您可以指定退出循环的条件。

正如Moinuddin所说,我们并不清楚问题的根源。但是,下面的代码显示了如何在列表长度发生变化时不断迭代列表:

def iterate_for_static_list_length(l):
    for i in range(len(l)):
        yield i
        l.append(object())


def iterate_for_dynamic_list_length(l):
    for i, _ in enumerate(l):
        yield i
        l.append(object())


if __name__ == '__main__':
    l = [object()] * 3

    print('Static implementation')
    for value in iterate_for_static_list_length(l):
        input(value)

    print('\nDynamic implementation')
    for value in iterate_for_dynamic_list_length(l):
        input(value)
输出

静态实现
0
1.
2.
动态实现
0
1.
2.
3.
4.
5.
6.
7.
8.

此程序将永远运行。在代码中,我可以看到您有条件地附加到循环中的列表,因此它似乎最终应该终止。

您的实现可能为它试图解决的问题嵌套了太多的循环

此第一个实现包含错误。有关修复方法,请参阅下文

或许可以尝试以下几点:

l = [97,122,111,98,111,98,101,103,103,104,97]
out = []
acc = []
for v in l:
    if len(acc)==0 or v >= acc[-1]:
        acc.append(v)
    else:
        if len(acc) > 1:
            out.append(acc)
        acc = [v]

print(out)
>>>[[97, 122], [98, 111], [98, 101, 103, 103, 104]]
以前的代码速度很慢,可以删除最后找到的片段。我在对其运行随机测试以尝试优化版本时发现了该错误。下面的代码显示了带有更正的原始代码和可以快30%的优化版本

def original(l):
    out = []
    acc = []
    added = False
    for v in l:
        if len(acc)==0 or v >= acc[-1]:
            acc.append(v)
        else:
            added = False
            acc = [v]

        if acc is not None and len(acc)>1 and not added:
            added = True
            out.append(acc)
    return out


def optimized(l):
    out = []

    acc = None
    tmp = None
    deb_v = False
    for v in l:
        prev =  acc[-1] if (acc is not None and len(acc)) else tmp
        if prev is not None and v >= prev:
            if tmp is not None:
                acc = []
                acc.append(tmp)
                out.append(acc)
                tmp = None
            acc.append(v)
        else:
            acc = None
            tmp = v
    return out


# The original test data
l = [97,122,111,98,111,98,101,103,103,104,97]
assert original(l) == optimized(l) == [[97,122],[98,111],[98,101,103,103,104]]

# A list that triggered last-fragment-dropped error
l = [57, 16, 6, 19, 40, 3, 4, 13, 2, 70, 85, 65, 32, 69, 54, 51, 95, 74, 92, 46, 45, 26, 0, 61, 99, 43, 67, 71, 97, 10, 18, 73, 88, 47, 33, 82, 25, 75, 93, 80, 23, 37, 87, 90, 49, 15, 35, 63, 17, 64, 5, 72, 89, 21, 50, 8, 41, 86, 31, 78, 52, 76, 56, 42, 77, 36, 11, 60, 39, 22, 68, 27, 24, 28, 59, 96, 29, 38, 12, 79, 53, 9, 83, 94, 34, 14, 7, 48, 30, 20, 66, 62, 91, 58, 81, 1, 98, 44, 55, 84]
assert original(l) == optimized(l)

# Random testing
import random
l = list(range(100))
random.shuffle(l)
assert original(l) == optimized(l)

# Timing!
import timeit

print(timeit.timeit("original(l)", globals={"l":l, "original": original}))
# 43.95869998800117

print(timeit.timeit("optimized(l)", globals={"l":l, "optimized": optimized}))
# 34.82134292599949

您为
循环解释了
的行为。但您试图解决的问题陈述不清楚。请编辑问题以解释所需的行为。还请提及示例输入和所需输出代码中的几个问题,而不是您陈述的问题。
a[m]
a[n]
是字符串,你首先在哪里定义
c
?你想做什么?在迭代时修改列表几乎总是一个坏主意。我编辑了这个问题,希望现在问题更清楚了。