无法在生成器中将字符串转换为浮点数
Could not convert string to float in generator
我正在尝试对 Python 2.7 中列出的嵌套数据执行一些基本操作。我的数据的简化版本如下所示:
resultlistdata = [
['sell','EURUSD',-1092.0,'Sometext'],
['buy','GBPUSD',2342.0,'Moretext'],
['buy','EURUSD',2122.0,'Yetmoretext'],
['not opened','','',''],
['sell','EURJPY',-483,'Difftext'],
['sell','EURJPY',269,'Anothertext'],
etc...
]
列表有几千行。我正在尝试计算列表中第三项大于或等于零的次数(因此上述情况下的正确结果为 3)。我正在使用生成器表达式(或者它是列表理解?):
profittrades = sum(1 for x in resultdatalist if x[2] >= 0)
给出的答案等于列表中的项目数(所以在上面的例子中是 6,这是错误的)。我也试过:
profittrades = sum(1 for x in resultdatalist if float(x[2]) >= 0)
给出错误 "ValueError: Could not convert string to float".
我几乎可以肯定问题出在 'not opened' 出现的那一行,它不能将空字符串转换为浮点数,我只是不知道该怎么办!
有没有一种方法可以使用 'one-liner' 列表理解方法进行计数,或者我是否需要进行循环?
"resultslistdata"是我自己编的,所以在制作的时候有什么高明的地方可以帮到我试试看。我不愿意输入值“0”作为 "never opened" 交易的利润,因为稍后当我做平均时它会扭曲我的结果 (?!)。
感谢任何能帮助我的人!
如果所有从未打开的交易(或类似的东西)都是空白''
,那么您可以这样做:
profittrades = sum(1 for x in resultdatalist if x[2] and float(x[2]) >= 0)
这首先检查字符串不是 falsy 即空白,然后再尝试 float
转换。
使用python 3.5 我可以做到:
profittrades = sum(
1 for x in resultdatalist if float(x[2] if x[2] != "" else -1) >= 0
)
我不知道这是否仍然适用于 python 的早期版本。
您可以将 sum
与 生成器表达式 一起使用,如:
>>> sum((val or 0) and val>=0 for _, _, val, _ in resultlistdata)
3
或者,您也可以在生成器表达式中使用 if
过滤器,如:
>>> sum(1 for _, _, val, _ in resultlistdata if val and val>=0)
3
我正在尝试对 Python 2.7 中列出的嵌套数据执行一些基本操作。我的数据的简化版本如下所示:
resultlistdata = [
['sell','EURUSD',-1092.0,'Sometext'],
['buy','GBPUSD',2342.0,'Moretext'],
['buy','EURUSD',2122.0,'Yetmoretext'],
['not opened','','',''],
['sell','EURJPY',-483,'Difftext'],
['sell','EURJPY',269,'Anothertext'],
etc...
]
列表有几千行。我正在尝试计算列表中第三项大于或等于零的次数(因此上述情况下的正确结果为 3)。我正在使用生成器表达式(或者它是列表理解?):
profittrades = sum(1 for x in resultdatalist if x[2] >= 0)
给出的答案等于列表中的项目数(所以在上面的例子中是 6,这是错误的)。我也试过:
profittrades = sum(1 for x in resultdatalist if float(x[2]) >= 0)
给出错误 "ValueError: Could not convert string to float".
我几乎可以肯定问题出在 'not opened' 出现的那一行,它不能将空字符串转换为浮点数,我只是不知道该怎么办!
有没有一种方法可以使用 'one-liner' 列表理解方法进行计数,或者我是否需要进行循环?
"resultslistdata"是我自己编的,所以在制作的时候有什么高明的地方可以帮到我试试看。我不愿意输入值“0”作为 "never opened" 交易的利润,因为稍后当我做平均时它会扭曲我的结果 (?!)。
感谢任何能帮助我的人!
如果所有从未打开的交易(或类似的东西)都是空白''
,那么您可以这样做:
profittrades = sum(1 for x in resultdatalist if x[2] and float(x[2]) >= 0)
这首先检查字符串不是 falsy 即空白,然后再尝试 float
转换。
使用python 3.5 我可以做到:
profittrades = sum(
1 for x in resultdatalist if float(x[2] if x[2] != "" else -1) >= 0
)
我不知道这是否仍然适用于 python 的早期版本。
您可以将 sum
与 生成器表达式 一起使用,如:
>>> sum((val or 0) and val>=0 for _, _, val, _ in resultlistdata)
3
或者,您也可以在生成器表达式中使用 if
过滤器,如:
>>> sum(1 for _, _, val, _ in resultlistdata if val and val>=0)
3