2013-12-09 3 views
0

Я пытаюсь выяснить какую-то домашнюю работу для введения в класс программирования. Кажется, я прошел долгий путь по поиску большей части информации. Я должен разработать программу, в которой пользователь вводит общее количество осадков за каждый из 12 месяцев. Он должен рассчитать и отобразить общее количество осадков за год, среднее количество осадков и месяцы с самыми высокими и самыми низкими суммами. Я могу заставить свою программу делать все, кроме отображения наименования месяца с наивысшим и самым низким. Как я уже упоминал, прежде чем я знаю, что я проделал длинный путь, и это, скорее всего, не самый эффективный путь. Вот мой код.Статистика Python-Rainfall

year=[] 
jan=float(input('Please enter Jan rainfall: ')) 
feb=float(input('Please enter Feb rainfall: ')) 
mar=float(input('Please enter Mar rainfall: ')) 
apr=float(input('Please enter Apr rainfall: ')) 
may=float(input('Please enter May rainfall: ')) 
jun=float(input('Please enter Jun rainfall: ')) 
jul=float(input('Please enter Jul rainfall: ')) 
aug=float(input('Please enter Aug rainfall: ')) 
sep=float(input('Please enter Sep rainfall: ')) 
oct=float(input('Please enter Oct rainfall: ')) 
nov=float(input('Please enter Nov rainfall: ')) 
dec=float(input('Please enter Dec rainfall: ')) 

year.extend((jan, feb, mar, apr, may, jun, jul, aug, sep, oct, nov, dec)) 

def lowest(): 
    print('The minimum rainfall is', min(year)) 
lowest() 

def highest(): 
    print('The most rainfall is', max(year)) 
highest() 

def total(): 
    print('The total rainfall is', sum(year)) 
total() 

def average(): 
    print('The average rainfall is', float(sum(year))/len(year)) 
average() 

Когда я это делаю, я получаю свои подсказки ввода, мин, максимальный, общий и средний. Я просто не знаю, где взять месячные имена для min и max. Если есть более быстрый способ, я все тоже за это. Благодарю.

ответ

0

Поскольку вы не можете использовать словари, вы можете сделать отдельный список для имен месяцев:

months = ["jan", "feb", "mar", ... ] 

Затем используйте индекс возвращаемого значения в любой заданной функции, чтобы получить имя месяца из другого списка, например.

def lowest(): 
    low = min(year) 
    month = months[year.index(low)] 
    print ... 
+0

Спасибо! Это именно то, что мне нужно! – FreddieB1027

1

я бы, вероятно, использовать dict здесь:

year = {} 
year['jan'] = float(input('Please enter Jan rainfall: ')) 
... 

Теперь, чтобы получить минимум:

def lowest(): 
    print('The minimum rainfall is', min(year.values())) 

lowest() 

Если вы хотите знать, в каком месяце была самая низкая:

def lowest2(): 
    print('The month of minimum rainfall is', min(year, key=lambda x:year[x])) 

lowest2() 
+0

К сожалению, эта глава относится к массивам/спискам и не содержит словарей. Поэтому, хотя, вероятно, было бы лучше, я не могу сделать это для этого задания, если это имеет смысл. – FreddieB1027

0

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

Если вы используете Dict, вы можете сделать: https://stackoverflow.com/a/268285/341744

In [1]: months = {"jan":20, "feb:":32, "mar":45} 

In [2]: max(months.iteritems(), key=operator.itemgetter(1))[0] 
Out[2]: 'mar' 

Вы можете автоматизировать ввод, я использовал только два месяца для краткости.

In [3]: 
def input_rainfall(months): 
    r = {} 
    for month in months: 
     while True: 
      try: 
       rain = float(input("Enter rainfall for {}: ".format(month))) 
       r[month] = rain 
       break 
      except ValueError: 
       print("You must enter a float") 
    return r 

months = input_rainfall(['jan', 'feb']) 
Enter rainfall for jan: 3.4 
Enter rainfall for feb: 3.41 


In [4]: max(months.iteritems(), key=operator.itemgetter(1))[0] 
Out[4]: 'feb' 

In [5]: min(months.iteritems(), key=operator.itemgetter(1))[0] 
Out[5]: 'jan' 
0

Если словари не могут использоваться, вы можете реализовать аналогичную логику с другим представлением данных для элементов в списке. Вы можете записать его в формате «Янв 10,0», где первая часть указывает месяц, а вторая - значение осадков. Код в этом случае будет примерно таким:

year=[] 
months = ["Jan","Feb","March","April","May","June","July","August","September","October","November","December"] 

for i in months: 
    year.append(i+"|"+str(input('Please enter '+i+' rainfall: '))) 

key_func = lambda s:s.split("|")[1] 
split_func = lambda s,index:s.split("|")[index] 

min_rainfall = min(year,key=key_func) 
print("Minimum Rainfall: "+split_func(min_rainfall,1)+" in the month of "+split_func(min_rainfall,0)) 

max_rainfall = max(year,key=key_func) 
print("Max Rainfall: "+split_func(max_rainfall,1)+" in the month of "+split_func(max_rainfall,0)) 

total = sum([float(split_func(p,1)) for p in year]) 
print("Total Rainfall: "+str(total)) 

print("Average Rainfall: "+str(float(total/len(year)))) 
Смежные вопросы