我在停止迭代之前遇到了一些麻烦,直到我使用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
如果有人可以帮我修改我的代码或帮助我考虑其他策略,那对我有很大的帮助。
答案 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 argrelextrema
和numpy 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)