使用python在csv文件中查找最大列

时间:2018-03-07 18:47:47

标签: python python-3.x python-2.7

我试图在csv

中找到最大值低于colm

列出[' 1154293',' 885773',' -448704',' 563679',' 555394' ,' 631974',' 957395',' 1104047',' 693464',' 454932',' 727272',' 125016',' 339251',' 78523',' 977084',' 1158718', ' 332681',' -341227',' 173826',' 742611',' 1189806',' 607363',' -1172384',' 587993',' 295198',' -300390',' 468995&#39 ;,' 698452',' 967828',' -454873',' 375723',' 1140526',&# 39; 83836',' 413189',' 551363',' 1195111',' 657081',' 66659&#39 ;,' 803301',' -953301',' 883934']

我运行了我写的代码

  for row in csvReader:


        Revenue.append(row[1])
        max_revenue=max(Revenue)
        print("max revenue"+str(max_revenue))

但是它没有获取最大值,输出结果是

        max revenue 977084

请建议,

4 个答案:

答案 0 :(得分:1)

这里的问题是您正在构建第1列字符串的列表,但是期望找到最大值作为数字,而不是字符串。

您可以通过构建映射到整数的第1列字符串列表来解决这个问题,其他答案显示:

for row in csvReader:
    Revenue.append(int(row[1]))
max_revenue=max(Revenue)

但另一种方法是使用max的关键功能:

for row in csvReader:
    Revenue.append(row[1])
max_revenue = max(Revenue, key=int)

更好的是,您可以使用相同的想法,不需要整个单独的Revenue列表:

max_revenue_row = max(csvReader, key=lambda row: int(row[1]))

这意味着您获得整个原始行,而不仅仅是整数值。因此,如果第2列是与第1列中的收入相关的用户名,则可以执行以下操作:

max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
best_salesman_name = max_revenue_row[2]

这也避免了在内存中构建一个额外的巨大列表;它只是一行一行地读入每一行,然后丢弃它们,只记得最大的那一行。

这通常很棒,但它有一个潜在的问题:如果你真的需要扫描两次或更多次而不是一次,第一次已经消耗了所有的行,所以第二次赢了#t找到任何。例如,这将在第二次调用中引发异常:

max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
min_revenue_row = min(csvReader, key=lambda row: int(row[1]))

理想的解决方案是重新组织代码,只扫描行一次。例如,如果您了解minmax的工作原理,您可以构建自己的min_and_max函数,同时执行这两项操作,然后像这样使用它:

min_revenue_row, max_revenue_row = 
    min_and_max(csvReader, key=lambda row: int(row[1]))

但有时候这是不可能的,或者至少在某种程度上不可能,你可以弄清楚如何可读写。我假设你不知道如何写min_and_max。那么,你能做什么?

您有两个不太理想但通常仍然可以接受的选项:将整个文件读入内存,或多次读取文件。这是两个。

rows = list(csvReader) # now it's in memory, so we can reuse it
max_revenue_row = max(rows, key=lambda row: int(row[1]))
min_revenue_row = min(rows, key=lambda row: int(row[1]))
with open(csvpath) as f:
    csvReader = csv.reader(f)
    max_revenue_row = max(csvReader, key=lambda row: int(row[1]))
with open(csvpath) as f:
    # whole new reader, so it doesn't matter that we used up the first
    csvReader = csv.reader(f)
    min_revenue_row = min(csvReader, key=lambda row: int(row[1]))

在你的情况下,如果CSV文件似乎很小,那真的不重要,但我可能会做第一个。

答案 1 :(得分:0)

这应该有效。由于数组的元素是字符串,因此需要先使用map(int,a)将它们转换为int。

a=['1154293', '885773', '-448704', '563679', '555394', '631974', '957395', '1104047', '693464', '454932', '727272', '125016', '339251', '78523', '977084', '1158718', '332681', '-341227', '173826', '742611', '1189806', '607363', '-1172384', '587993', '295198', '-300390', '468995', '698452', '967828', '-454873', '375723', '1140526', '83836', '413189', '551363', '1195111', '657081', '66659', '803301', '-953301', '883934']
print(max(map(int, a)))

答案 2 :(得分:0)

我认为问题在于数据类型。由于你的数字是'',它们被解释为字符串,因此考虑到它给出了最大值。

您可能希望将每个字符串转换为整数。像这样:

new_list = [int(number) for number in old_list]

希望这有帮助。

答案 3 :(得分:0)

谢谢大家

我转换为int

Revenue.append(int(row[1]))

现在工作正常。

感谢收益