2015-06-10 44 views
1

有一種叫做CSV與vic_visitors.csv這樣的數據:如何在Python 2.7中從csv-read數據中找到最大數量?

Victoria's Regions,2004,2005,2006,2007 
Gippsland,63354,47083,51517,54872 
Goldfields,42625,36358,30358,36486 
Grampians,64092,41773,29102,38058 
Great Ocean Road,185456,153925,150268,167458 
Melbourne,1236417,1263118,1357800,1377291 

而且還有一個問題,問:

問:寫程序,找出維多利亞最大的參觀人數從 的CSV數據vic_visitors.csv。你的程序應該在 打印結果的格式「最大的visitornumber是‘X’的‘Y’的一年‘Z’。

我可以做,直到使這裏data_2d給我的訪問數據在2維與data_2d[i]=rowdata_2d[i][j]=column信息:

import csv 
visitors=open("vic_visitors.csv") 
data=csv.reader(visitors) 
data_2d=list(data) 

,但我完全迷失了方向如何檢索一年的最大人數及其對應的區域和

回答

4

你有4個問題需要解決:

  • 你需要保持列標題,所以你可以報告年度正常
  • csv給你的一切作爲字符串,當你需要數字比較值
  • 你需要找到每一行的最大值。
  • 您需要查找給定行的最大值。

您可以使用DictReader()解決第一部分。您可以在讀取文件時將值轉換爲整數,或者在確定最大值時轉換值。您可以在閱讀時確定每行的最大值,或者一次完成最後一步。

閱讀時,丟棄你不要在這個過程中需要的所有數據我會做盡可能多的:

import csv 

maximum_value = None 
with open("vic_visitors.csv", 'rb') as visitors: 
    reader = csv.DictReader(visitors) 
    for row in reader: 
     count, year = max((int(row[year]), year) for year in reader.fieldnames[1:]) # skip the first column 
     if not maximum_value or count > maximum_value[0]: 
      maximum_value = (count, row[reader.fieldnames[0]], year) 

print "The greatest visitornumber was {} in {} in the year {}.".format(
    *maximum_value) 

max(...)線遍歷各行字典中的鍵值對(其中使用CSV的第一行作爲關鍵字),選擇年份列(所有字段除外)。通過首先將數值設置爲該行的最大列值,並與年份配對。然後,我們存儲迄今爲止發現的最大行信息(只是計數,地區和年份);然後,不需要保留其他行。然後,通過將這3個值插入到模板中,最後格式化該元組。

通過使用DictReader.fieldnames list我們保持這種靈活性;只要第一列是一個地區,其餘的年份代碼將適應任何變化。

演示:

>>> import csv 
>>> sample = '''\ 
... Victoria's Regions,2004,2005,2006,2007 
... Gippsland,63354,47083,51517,54872 
... Goldfields,42625,36358,30358,36486 
... Grampians,64092,41773,29102,38058 
... Great Ocean Road,185456,153925,150268,167458 
... Melbourne,1236417,1263118,1357800,1377291 
... '''.splitlines(True) 
>>> maximum_value = None 
>>> reader = csv.DictReader(sample) 
>>> for row in reader: 
...  count, year = max((int(row[year]), year) for year in reader.fieldnames[1:]) # skip the first column 
...  if not maximum_value or count > maximum_value[0]: 
...   maximum_value = (count, row[reader.fieldnames[0]], year) 
... 
>>> print "The greatest visitornumber was {} in {} in the year {}.".format(
...  *maximum_value) 
The greatest visitornumber was 1377291 in Melbourne in the year 2007. 
0

你可以用下面的辦法,其通過掃描每一個條目並分配max和最大參數的條目超過了目前的最高值各一次。

import csv 
with open('vic_visitors.csv') as f: 
    reader = csv.DictReader(f) 
    max = 0  
    for row in reader: 
     if(float(row['2004'])>max): 
      max = float(row['2004']) 
      maxyear = '2004' 
      maxloc = row["Victoria's Regions"] 
     if(float(row['2005'])>max): 
      max = float(row['2005']) 
      maxyear = '2005' 
      maxloc = row["Victoria's Regions"] 
     if(float(row['2006'])>max): 
      max = float(row['2006']) 
      maxyear = '2006' 
      maxloc = row["Victoria's Regions"] 
     if(float(row['2007'])>max): 
      max = float(row['2007']) 
      maxyear = '2007' 
      maxloc = row["Victoria's Regions"]   

print("The greatest visitornumber was "+ str(max) +" in " +maxloc+ " in the year "+maxyear) 
相關問題