【问题标题】:Python csv: finding out rows with biggest valuesPython csv:找出具有最大值的行
【发布时间】:2011-02-25 13:31:50
【问题描述】:

我一定遗漏了一些东西,但我无法找出最大值并使用 csv.DictReader() 函数打印它们。

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

(希望我得到所有字段,我不得不对原始文件使用 cut。)

我用

阅读了这个文件
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

我怎样才能做到这一点?我想这样做是为了方便添加新字段。

【问题讨论】:

    标签: python csv


    【解决方案1】:

    tank = list(itertools.islice(tanks,1,2)) 中,您将 tank 定义为一个列表。

    best_tanks 是一个字典,其值为列表 tank。

    在您的if 中,您将 best_tanks 中的列表替换为现在是字典的变量 tank,因此可以稍后使用 best_tanks[field][field]

    但是如果ifif没有被执行,best_tanks中的元素还是会有一个list,导致best_tanks[field]是一个list,当你尝试用字符串字段

    【讨论】:

    • 是的,我这样做了,并且在我修复了另一个错误(导致为函数提供了一个空的字典)后它工作了。
    猜你喜欢
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-07
    • 2013-01-23
    相关资源
    最近更新 更多