我试图在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
请建议,
答案 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]))
理想的解决方案是重新组织代码,只扫描行一次。例如,如果您了解min
和max
的工作原理,您可以构建自己的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]))
现在工作正常。
感谢收益