2011-02-25 47 views
2

我必須缺少某些東西,但是我無法找到最大值並使用csv.DictReader()函數打印它們。Python csv:找出最大值的行

CSV文件是一樣的東西(我已經削減領域以及行,因爲行是太寬了這種格式):

traverse;damage;hull_front;turret_back;penetration;full_name;tier;hull_back;turret_sides;type;hull_sides;turret_front 
38;30;18;16;32;Light Tank MS-1;1;16;16;Light Tank;16;18 
40;30;13;13;32;Light Tank BT-2;2;13;13;Light Tank;13;15 
55;36;15;15;34;Light Tank T-26;2;15;15;Light Tank;15;15 

(希望我得到了所有的領域,我不得不使用切斷與原文件。)

我閱讀

tanks = csv.DictReader(open('tanks.csv', 'r'), delimiter = ';') 

這個文件,但是當我試圖發現瞭如哪一行在哪個列中具有最大的價值,我似乎無法通過字典來閱讀。我的嘗試是這樣的:

def top_values(tanks): 
    tank = list(itertools.islice(tanks,1,2)) 

    best_tanks = dict({'turret_front':tank, 'turret_sides':tank, 'turret_back':tank, 
        'hull_front':tank, 'hull_sides':tank, 'hull_back':tank, 
        'penetration':tank, 'damage':tank, 'traverse':tank}) 

    fields = ['turret_front', 'turret_sides', 'turret_back', 
      'hull_front', 'hull_sides', 'hull_back', 
      'penetration', 'damage', 'traverse'] 

    for tank in tanks: 
     for field in fields: 
     if tank[field] > best_tanks[field][field]: 
      best_tanks[field] = tank 

    print "Best tanks by values:\n" 
    for field in fields: 
    tank = best_tanks[field] 
    print field + ": " + tank['full_name'] + "(" + tank[field] + ")" 

,但我得到

Traceback (most recent call last): 
File "./wotalyzer.py", line 102, in <module> 
main(sys.argv[1:]) 
File "./wotalyzer.py", line 98, in main 
top_values(tanks) 
File "./wotalyzer.py", line 44, in top_values 
print field + ": " + tank['full_name'] + "(" + tank[field] + ")" 
TypeError: list indices must be integers, not str 

我怎樣才能做到這一點?我想這樣做,以便輕鬆添加新字段。

回答

2

tank = list(itertools.islice(tanks,1,2))中,您將tank定義爲一個列表。

best_tanks是一個字典值與列表坦克。

在您的if中,您將best_tanks中的列表替換爲現在是字典的變量坦克,因此稍後可以使用best_tanks[field][field]

但是,如果,如果沒有執行if,在best_tanks元素仍將有一個列表,導致best_tanks[field]是一個列表,這將導致錯誤TypeError: list indices must be integers, not str當你嘗試用字符串字段訪問元素

+0

是的,我做到了這一點,它修復了一個其他的錯誤(這導致了一個空的字典給函數)後,它的工作原理。 – Makis 2011-02-25 13:53:57