如何在Python 2.7中从csv-read数据中找到最大数量?

时间:2015-06-10 08:36:28

标签: python file python-2.7 csv

有一个名为vic_visitors.csv的CSV,其中包含以下数据:

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

有一个问题:

  

Q值。写一个程序,找到维多利亚州最大的访客人数   CSV数据vic_visitors.csv。您的程序应该打印结果   格式"最大的访客数量是' x'在' y'在这一年' z'。

我可以在此处访问数据,以便data_2d通过data_2d[i]=rowdata_2d[i][j]=column为我提供二维信息:

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

但我对如何检索最大数量的人及其相应的地区和年份感到很遗憾。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分:0)

您可以使用以下方法扫描每个条目,并在每次条目超过当前最大值时分配max和max参数。

{{1}}