Python到达某一点时停止迭代

时间:2017-10-24 16:17:15

标签: python list loops iteration do-while

我在停止迭代之前遇到了一些麻烦,直到我使用Python到达列表中的某个点。我有一个看起来像这样的列表:

lst = [-0.5, 44, 90, 132.22, 129.6, 89, 67.91, 12.5, 11, 0.0006, 10.2, 67, 89.07, 100, 132.224, 129.88, 120.1, 100, 89.5, 75, 40, 9.8, -0.4, 0.1, 90, 99, 112, 132.22]

之前我曾经问过question与此类似的情况,其中列表的格式有些不同。这次,在每个实验系列中,压力开始为低,然后上升到最大值,并再次降低。

我想获得每个实验的每个起点和终点的索引和值。

例如,此列表中有三个实验。产出将是:

E 1:
Start: (0, -0.5) # starts at index 0, value -0.5
End: (3, 132.22)

E 2:
Start: (9, 0.0006)
End: (14, 132.224)

E 3:
Start: (22, -0.4)
End: (27, 132.22)

我目前正在尝试迭代每个值;但是,将每个值与另一个值进行比较并不完全有用。例如,如果找到Start,我想跳出循环,然后前进找到End.。根据我到目前为止所学到的,我正在尝试做这样的事情:

for idx, item in enumerate(lst):
    current = item
    next = lst[(idx + 1) % len(lst)]
    if current < next:
        print(current)
    continue
    if next < current:
        print(next)
    continue

如果有人可以帮我修改我的代码或帮助我考虑其他策略,那对我有很大的帮助。

2 个答案:

答案 0 :(得分:3)

这是一个以生成器形式出现的纯Python解决方案。

def get_groups(lst):
    up = False
    for i, (u, v) in enumerate(zip(lst, lst[1:])):
        if up:
            if v < u:
                yield 'End', i, u
                up = False
        else:
            if v > u:
                yield 'Start', i, u
                up = True
    if up:
        yield 'End', i + 1, lst[-1]


lst = [-0.5, 44, 90, 132.22, 129.6, 89, 67.91, 12.5, 11, 0.0006, 10.2,
    67, 89.07, 100, 132.224, 129.88, 120.1, 100, 89.5, 75, 40, 9.8, -0.4,
    0.1, 90, 99, 112, 132.22,
]

for t in get_groups(lst):
    print(t)

<强>输出

('Start', 0, -0.5)
('End', 3, 132.22)
('Start', 9, 0.0006)
('End', 14, 132.224)
('Start', 22, -0.4)
('End', 27, 132.22)

如果您不希望像循环一样处理列表中的所有内容,您可以创建生成器,然后在其上调用next以从中获取下一个元组,例如

gen = get_groups(lst)
print(next(gen))
print(next(gen))

<强>输出

('Start', 0, -0.5)
('End', 3, 132.22)

您也可以这样做:

gen = get_groups(lst)
for i, (t1, t2) in enumerate(zip(gen, gen), 1):
    print(i, t1, t2)

<强>输出

1 ('Start', 0, -0.5) ('End', 3, 132.22)
2 ('Start', 9, 0.0006) ('End', 14, 132.224)
3 ('Start', 22, -0.4) ('End', 27, 132.22)

答案 1 :(得分:1)

一个scipy argrelextremanumpy greater以及less的解决方案,以获取局部最小值和最大值,zip以将它们组合起来i,e

from scipy.signal import argrelextrema
import numpy as np 

lst = [-0.5, 44, 90, 132.22, 129.6, 89, 67.91, 12.5, 11, 0.0006, 10.2, 67, 89.07, 100, 132.224, 129.88, 120.1, 100, 89.5, 75, 40, 9.8, -0.4, 0.1, 90, 99, 112, 132.22]
arr = np.array(lst)

#Find local minimas index, add zero in the beginning
minInd = np.insert(argrelextrema(arr, np.less),0,0)
# Find local maximas index, add the length of arr - 1 at the end 
maxInd = np.append(argrelextrema(arr,np.greater),[len(lst)-1])

# numpy indexing and zip to combine the results
end_arr = list(zip(zip(minInd,arr[minInd]),zip(maxInd,arr[maxInd])))

#Printing the output
for i in end_arr:
    print('Start :' , i[0])
    print('End:', i[1],'\n')

Start : (0, -0.5) 
End: (3, 132.22) 

Start : (9, 0.00059999999999999995)
End: (14, 132.22399999999999) 

Start : (22, -0.40000000000000002)
End: (27, 132.22)