因此,我在查找大量字符串列表中的最大十进制整数时遇到了很多麻烦(1500ish)。这是我在函数中的内容(找到最大值):
all_data_lines = data.split('\n');
maxvalue = float(0.0);
for item in all_data_lines:
temp = item.split(',')[1];
if (float(temp) > maxvalue):
maxvalue = float(temp);
return maxvalue
数据文件本质上是一个巨大的列表,由新行分隔,然后由逗号分隔。所以,我需要比较每一行上的第二个逗号分隔元素。 这就是我上面提到的。出于某种原因,我遇到了这个错误:
in max_temperature
temp = item.split(',')[1];
IndexError: list index out of range
答案 0 :(得分:2)
你显然有些行没有逗号;也许你有空行。如果您使用的是data.split('\n')
,那么您最终可能会得到最后一个空值,例如:
>>> '1\n2\n'.split('\n')
['1', '2', '']
>>> '1\n2\n'.splitlines()
['1', '2']
另一方面,使用str.splitlines()
会产生一个没有最后一个空值的列表。
不是手动拆分每一行,而是手动循环,而是使用csv
模块和生成器表达式:
import csv
def foo(data):
reader = csv.reader(data.splitlines(), quoting=csv.QUOTE_NONNUMERIC)
return max(r[1] for r in reader if len(r) > 1)
此委托分割到csv.reader()
对象,让您可以专注于测试具有足够元素的行以获得第二列。
csv.QUOTE_NONNUMERIC
选项告诉读者将值转换为浮动值,这样您就不用再这样做了。但是,仅当所有没有引号的列都是数字时,此方法才有效。如果情况并非如此,而您获得ValueErrors
,则仍可以手动执行转换:
def foo(data):
reader = csv.reader(data.splitlines())
return max(float(r[1]) for r in reader if len(r) > 1)