2014-02-13 2 views
-2

Имейте назначение для поиска среднего и максимального количества осадков в файле «BoulderWeatherData.csv». Нашли средний балл, используя этот код:Поиск максимального значения в файле CSV

rain = open("BoulderWeatherData.csv", "r") 
    data = rain.readline() 
    print(rain) 
    data = rain.readlines() 
    total = 0 
    linecounter = 0 
    for rain in data: 
     linecounter = linecounter + 1 
     print("The number of lines is", linecounter) 

    for line in data: 
     r = line.split(",") 
     total = total + float(r[4]) 
    print(total) 


    average = float(total/linecounter) 
    print("The average rainfall is ", "%.2f" % average) 

Однако, похоже, не удается найти максимум, используя этот же процесс. Попытка использования max, функция, но ответ, который должен быть получен, - это номер плавания, который не может быть повторен с помощью max.

Любая помощь будет оценена по достоинству.

+0

Можете ли вы предоставить доступ к BoulderWeatherData.csv? Ссылка на Dropbox кажется мертвой. – bmandesign

+0

Приношу свои извинения. Повторно поднял ссылку на Dropbox. Надеюсь, это исправит. – user3308130

+5

@ user3308130 - Вместо этого вставьте соответствующее содержимое своего csv. Не следует делать ссылку на внешний код или файлы, так как (как мы видели) он может быть подвержен ошибкам или другим проблемам. Вопросы SO должны быть самодостаточными. – admdrew

ответ

0
max=0 
for line in data: 
     r = line.split(",") 
     if float(r[4]) > max: 
      max=float(r[4]) 
print(max) 

что-то подобное

-1

Этот код будет пытаться найти максимальное значение, а среднее значение, поплавков, хранящихся в 5-ю позицию в .csv.

rainval = [] 

Инициализирует пустой массив, в котором мы будем хранить значения.

with open ("BoulderWeatherData.csv", "r") as rain: 

Открывает файл .csv и называет его «дождем».

for lines in rain: 

Это считывает каждую строку дождя до конца файла.

 rainval += [float(lines.strip().split(",")[4])] 

Мы добавляем значение поплавка, найденное в пятом положении (четвертый индекс) линии.

Повторяем выше для каждой строки, расположенной в CSV-файле.

print (sorted(rainval)[len(rainval)]) 

Это сортирует значения в массиве rainval, а затем берет последнее (наибольшее) значение и печатает его. Это максимальное значение и лучше, чем max, потому что оно может обрабатывать float, а не только ints.

print (sum(rainval)/len(rainval)) 

Это печатает среднее количество осадков.


В качестве альтернативы, если мы не хотим использовать массивы:

maxrain = -float("inf") 
total, count = 0, 0 
with open ("test.txt", "r") as rain: 
    for lines in rain: 
     temp = float(lines.strip().split(",")[4]) 
     if maxrain < temp: 
      maxrain = temp 
     total += temp 
     count += 1 

print (maxrain) 
print (total/count) 
+0

Привет, что случилось с моим ответом? – EducateMe

+2

'data []' недействителен Python. 'sorted (rain)' просто возвращает новый отсортированный список, никоим образом не изменяя «дождь». 'rain [len (rain)]' гарантированно будет 'IndexError'. Вам также не хватает двоеточия. Вы также используете «дождь», файл, вместо «данных». Даже если вы все это исправили, ваш алгоритм не имеет смысла - он должен сортировать по 4-му элементу в каждой строке, но вы пытаетесь сортировать по всему списку элементов. И затем вы пытаетесь суммировать эти списки, как если бы они были числами. – abarnert

+0

Удивительный, спасибо за помощь! Как выглядит ответ? – EducateMe

0
import csv 

INPUT = "BoulderWeatherData.csv" 
PRECIP = 4 # 5th column 

with open(INPUT, "rU") as inf: 
    incsv = csv.reader(inf) 
    header = next(incsv, None) # skip header row 
    precip = [float(row[PRECIP]) for row in incsv] 

avg_precip = sum(precip, 0.)/(1 and len(precip)) # prevent div-by-0 
max_precip = max(precip) 

print(
    "Avg precip: {:0.3f} in/day, max precip: {:0.3f} in/day" 
    .format(avg_precip, max_precip) 
) 

возвращает

Avg precip: 0.055 in/day, max precip: 1.980 in/day 
0

Вы уже аккумулирующие total через итерации цикла.

Чтобы отслеживать в maxvalue, это в основном то же самое, за исключением того, вместо добавления вы max ING:

total = 0 
maxvalue = 0 

for line in data: 
    r = line.split(",") 
    value = float(r[4]) 
    total = total + value 
    maxvalue = max(maxvalue, value) 

print(total) 
print(maxvalue) 

Или, если вы не хотите использовать функцию max:

for line in data: 
    r = line.split(",") 
    value = float(r[4]) 
    total = total + value 
    if value > maxvalue: 
     maxvalue = value 
2

Это мой предпочтительный способ справиться с этим.

#!/usr/bin/env python3 

rain = open("BoulderWeatherData.csv","r") 

average = 0.0 
total = 0 
maxt = 0.0 

for line in rain: 
    try: 
     p = float(line.split(",")[4]) 
     average += p 
     total += 1 
     maxt = max(maxt,p) 
    except: 
     pass 

average = average/float(total) 

print("Average:",average) 
print("Maximum:",maxt) 

Это Выведет:

Average: 0.05465272591486193 
Maximum: 1.98 
Смежные вопросы