2013-07-19 16 views
6

Mam kilka plików CSV zawierających dane i liczby w czasie, napisałem funkcję zwracającą pierwsze wystąpienie liczby poniżej progu (x) w ten sposób:Powracający pierwszy indeks występowania liczby na liście

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return n 
      break 
     n += 1 

wyjątkiem, że kiedy pętla wykonanie funkcji odrzuceń w ten sposób:

for i in os.listdir(resultDir): 

    if "csv" in i: 
     csvFile = resultDir+i 
     print csvFile 
     with open(csvFile, 'rb') as f: 
      reader = csv.reader(f) 
      tickList = [] 
      for line in reader: 
       tickList.append(line) 

     print bounce(tickList,5) 

utrzymuje się na powrocie do zera (choć pierwsza wartość jest powyżej próg).

Gdzie się mylę?


Oto przykład jednego z plików csv:

1373289767.454535,9.9 
1373289769.728528,9.9 
1373289771.817576,9.9 
1373289773.813036,11.7 
1373289775.810985,11.7 
1373289777.769641,11.7 
1373289779.783134,12.2 
1373289781.774255,11.8 
1373289783.799892,12.0 
1373289785.812967,11.4 
1373289787.816991,11.4 
1373289789.790835,11.3 
1373289791.811245,10.9 
1373289793.880356,10.8 
1373289795.846866,10.7 
1373289797.847552,10.6 
1373289799.858929,10.6 

góry dzięki.

EDIT po komentarzach

Oto nowa funkcja:

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return n 
     n += 1 

jeśli mogę wydrukować pływaka (I) [1] zwraca odpowiednie numery więc dzwoni odpowiednie pliki .

DRUGA EDYCJA

znaleźć problemu, „poziom” ja karmienie było w rzeczywistości str a nie int, dzięki za każdego, kto miał wygląd i pomógł.

+2

Nie jestem pewien, czy identyfikacja w podanym przykładzie jest prawidłowa, ale co to jest 'break' po poleceniu' return n'? – Ma3x

+1

Co to pokazuje, jeśli drukujesz float (i [1])? – Jiminion

+0

Tak, instrukcja break nie wydaje się pomagać ..... – Jiminion

Odpowiedz

0
def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return n # return float(i[1) 
      n += 1 
    return None 

coś takiego?

+0

To nie zwraca indeksu. Nie wyjaśnia również błędu, jaki widzi OP. –

+0

Chciał pierwszego wystąpienia liczby. To nie brzmiało jak indeks (ale oczywiście jego kod to pokazał). – Jiminion

+0

Wprowadziłeś błąd wcięcia, podejrzewam, że OP ma. –

1

Jesteś smutny, że potrzebujesz wartości poniżej progu i to jest dokładnie to, co w Twoim kodzie. Ale gdy spodziewacie się wartości powyżej progu. Zmień bounce() lub próg ot Test dane :)

import csv 

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     #print float(i[1]) 
     if float(i[1]) > x: 
      return n 
     n += 1 

csvFile = 'test.csv' 
print csvFile 
tickList = [] 
with open(csvFile, 'rb') as f: 
    reader = csv.reader(f) 
    for line in reader: 
     tickList.append(line) 

print bounce(tickList,5) 

Ten kod drukuje 0.

+0

w ten sposób zwraca "Brak" –

+1

Och, przesunąłem 'tickList = []' z 'with'. – twil

2

I silnie podejrzany, że wcięcie jest błędne, a przez zmieszanie spacje i tabulatory Python interpretuje swoją metodę jako: zwiększa n

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return n 
      break 
    n += 1 

gdzie n += 1 pozostało poza pętlę i nigdy.Alternatywnie, n += 1 może być wcięty zbyt daleko:

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return n 
      break 
      n += 1 

Twoja funkcja wróci 0 dla każdego przypadku, w którym znajduje się wiersz z float(i[1]) poniżej x.

Możesz testować takie problemy, uruchamiając skrypt z python -tt scriptname.py, gdzie -tt mówi Pythonowi, aby szukał niespójnego użycia kart i spacji i zgłaszał błąd, jeśli znajdzie takie problemy.

Można uprościć swój kod za pomocą enumerate() i inline testu wyjściu odczytu pliku wcześnie:

for fname in os.listdir(resultDir): 
    if "csv" in fname: 
     csvFile = os.path.join(resultDir, fname) 
     print csvFile 
     with open(csvFile, 'rb') as f: 
      reader = csv.reader(f) 
      for i, row in enumerate(reader) 
       if float(row[1]) < 5: 
        print i 
        break # exit for loop, continue with next file 

Wewnętrzna for pętla może zostać uproszczone w dół dodatkowo za pomocą next() i wyrażenia generatora:

with open(csvFile, 'rb') as f: 
    reader = csv.reader(f) 
    print next((i for i, r in enumerate(reader) if float(r[1]) < 5), 'Not found') 

jak next()zatrzymuje przelotowe raz resu Zostało znalezione.

+0

Side gripe - dlaczego '-tt' nie jest domyślny !? Mieszanie zakładek i spacji w programie Pythona jest receptą na katastrofę i można go łatwo uniknąć. – JoshG79

+0

@ JoshG79: Ponieważ mieszanie zakładek i spacji * może * być wykonywane, jeśli zostanie zrobione ostrożnie. Ale nawet przy dobrym IDE, które jest trudne i trudne, powinno się go unikać. Wcześniejszy kod nie powinien się zepsuć, ponieważ nagle Python zdecyduje, że miksowanie nie jest już dozwolone. –

0

Nie jestem przekonany trzeba wszystkich danych do pamięci, więc może coś tak prostego jak:

reader = enumerate(csv.reader(f)) 
idx, row = next((r for r in reader if float(r[1][1]) < 5), (None, None)) 
0

Upewnij się, że nie mieszają spacje i tabulatory w wcięć.

Działa to zgodnie z oczekiwaniami (edytowałem oryginalną funkcję, aby zwrócić zarówno indeks, jak i wartość elementu).

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return (n, i[1]) 
     n += 1 
Powiązane problemy