2013-07-19 2 views
6

У меня есть куча csv-файлов, содержащих данные о времени и числах, я написал функцию для возврата первого числа числа ниже порога (x) следующим образом:Возвращение индекса первого появления числа в списке

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

за исключением того, что, когда я петля выполнение функции перескакивания этот путь:

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) 

он держит на возвращение к нулю (даже если первое значение выше порог).

Куда я иду не так?


Вот пример одного из файлов 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 

Спасибо заранее.

EDIT после комментариев

Вот новая функция:

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

если я печатаю поплавок (я [1]) возвращает правильные номера, чтобы он зовёт нужные файлы ,

ВТОРОЙ EDIT

нашел проблему, «уровень» Я кормил это было на самом деле ул и не INT, спасибо всем, кто имел вид и помог.

+2

Я не уверен, что идентификация в приведенном примере верна, но что такое 'break' делать после инструкции' return n'? – Ma3x

+1

Что он показывает, если вы печатаете float (i [1])? – Jiminion

+0

Да, оператор break не помогает ..... – Jiminion

ответ

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 

что-то вроде этого ???

+0

Это не возвращает индекс. Также он не объясняет ошибку, которую видит ОП. –

+0

Он хотел первого появления числа. Это не похоже на индекс (но его код показал это, очевидно). – Jiminion

+0

Вы сделали ошибку с отступом, которую я подозреваю в OP. –

1

Вам грустно, что вам нужно значение ниже порога, и это именно то, что в вашем коде. Но после того, как вы ожидаете значение выше порог. Изменение bounce() или порог ВЗ тестовых данных :)

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) 

Этот код печатает 0.

+0

Выполнение этого возвращает «Нет» –

+1

О, я переместил 'tickList = []' из 'with'. – twil

2

Я сильно подозревает, что ваши отступы неверны, и смешения пробелов и табуляции Python интерпретирует метод как:

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

где n += 1 не остался снаружи петли и никогда не увеличивает n.В качестве альтернативы, n += 1 может быть отступом слишком:

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

Ваша функция будет возвращать 0 для любого случая, когда имеется ряд с float(i[1]) ниже x.

Вы можете протестировать такие проблемы, запустив свой скрипт с помощью python -tt scriptname.py, где -tt сообщает python искать непоследовательное использование вкладок и пробелов и вызывать ошибку, если обнаруживает такие проблемы.

Вы можете упростить код с помощью enumerate() и встраивания теста, выхода чтения файла рано:

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 

Внутренней for петли может быть упрощена дальше вниз, используя next() и выражение генератора:

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') 

в next()остановки зацикливания раз в RESU Это было найдено.

+0

Side gripe - почему '-tt' не по умолчанию !? Смешивание вкладок и пробелов в программе python - это рецепт катастрофы и легко можно избежать. – JoshG79

+0

@ JoshG79: Так как микширование вкладок и пробелов * может быть выполнено, если сделать это тщательно. Но даже с хорошей IDE, которая сложна и сложна, и ее следует избегать на самом деле. Устаревший код не должен прерываться, потому что внезапно Python решает, что смешивание больше не разрешено. –

0

Я не уверен, что вам нужно все данные в памяти, поэтому, возможно, что-то же просто, как:

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

Убедитесь, что вы не смешиваясь пробелы и табуляцию в identation.

Это работает как ожидалось для меня (я отредактировал исходную функцию, чтобы вернуть как индекс, так и значение элемента).

def bounce(tickList,x): 
    n = 0 
    for i in tickList: 
     if float(i[1]) < x: 
      return (n, i[1]) 
     n += 1 
Смежные вопросы