Mam tablicę i funkcję i chciałbym, aby funkcja zwróciła listę indeksów, w których różnica dwóch kolejnych elementów przechodzi próg.

Mam:

def func (y, t=100):
    for i in range(1, len(y)): #Range skips 1st element
        if abs(y[i] - y[i-1]) > t:
            return(i)

Problem, z którymi stoję, jest to, że ta funkcja zwraca tylko pierwszy indeks, w którym moje oświadczenie jest prawdziwe. Jak odpocząć z nich?

2
GK89 5 czerwiec 2018, 07:01

3 odpowiedzi

Najlepsza odpowiedź

Istnieją dwa sposoby. Najpierw yield zamiast return da Ci generator:

def func (y, t=100):
    for i in range(1, len(y)): #Range skips 1st element
        if abs(y[i] - y[i-1]) > t:
            yield(i)

Lub dodaj listę funkcji:

def func (y, t=100):
    output = []
    for i in range(1, len(y)): #Range skips 1st element
        if abs(y[i] - y[i-1]) > t:
            output.append(i)
    return output
4
Ilya 5 czerwiec 2018, 04:07
def peak_detect (y_, threshold=100):
    indicesList = []
    for i in range(1, len(y_)): #Range skips 1st element
        if abs(y[i] - y[i-1]) > threshold:
            indicesList.append(i)
    return(indicesList)
2
Ashok Kumar 5 czerwiec 2018, 04:05

Z Rozumienie listy Możesz to zrobić jak:

Kod:

def peak_detect(in_data, threshold=100):
    return [i for i, (x, y) in enumerate(zip(in_data, in_data[1:]))
            if abs(y - x) >= threshold]

Kod testu:

data = [1, 2000, 2001, 4000]

print(peak_detect(data))

Wynik:

[0, 2]
4
Stephen Rauch 5 czerwiec 2018, 04:08