Python 无法在生成器中将字符串转换为浮点值

Python 无法在生成器中将字符串转换为浮点值,python,list-comprehension,nested-lists,Python,List Comprehension,Nested Lists,我正在尝试使用Python2.7中列出的嵌套数据执行一些基本操作。我的数据的简化版本如下所示: resultlistdata = [ ['sell','EURUSD',-1092.0,'Sometext'], ['buy','GBPUSD',2342.0,'Moretext'], ['buy','EURUSD',2122.0,'Yetmoretext'], ['not opened','','',''], ['sell','EURJPY',-483,'Difftext'], ['sell','E

我正在尝试使用Python2.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)。我使用的是生成器表达式(或者是列表理解?):

它给出的答案等于列表中的项目数(在上述情况下为6,这是错误的)。我也尝试过:

profittrades = sum(1 for x in resultdatalist if float(x[2]) >= 0)
这将导致错误“ValueError:无法将字符串转换为浮点”

我几乎可以肯定这个问题是由发生“未打开”的行引起的,它无法将空字符串转换为浮点,我只是不知道该怎么办

有没有一种方法可以使用“一行”列表理解方法进行计数,或者我需要做一个循环

“resultslistdata”是由我编译的,因此,如果在创建它时有什么聪明的方法可以帮助我,我可以尝试一下。我不愿意输入“0”作为“从未开盘”交易的利润,因为以后当我进行平均时,它会扭曲我的结果(?!)


谢谢所有能帮助我的人

如果所有从未开盘的交易(或类似的交易)都是空白的
,那么您可以:

profittrades = sum(1 for x in resultdatalist if x[2] and float(x[2]) >= 0)

在尝试进行
浮动
转换之前,首先检查字符串是否为空。

如果所有从未打开的交易(或类似的交易)都是空的
'
,则可以执行以下操作:

profittrades = sum(1 for x in resultdatalist if x[2] and float(x[2]) >= 0)

这将首先检查字符串是否为falsy(即空白),然后再尝试
浮点转换。

使用python 3.5我可以执行以下操作:

profittrades = sum(
    1 for x in resultdatalist if float(x[2] if x[2] != "" else -1) >= 0
)

但我不知道这在早期版本的python中是否仍然有效。

使用python 3.5,我可以做到:

profittrades = sum(
    1 for x in resultdatalist if float(x[2] if x[2] != "" else -1) >= 0
)
但我不知道这在早期版本的python中是否仍然有效。

您可以将生成器表达式用作:

>>> sum(1 for _, _, val, _ in resultlistdata if val and val>=0)
3
或者,您也可以在生成器表达式中使用
if
过滤器,如下所示:

>>> sum(1 for _, _, val, _ in resultlistdata if val and val>=0)
3
可以将生成器表达式用作:

>>> sum(1 for _, _, val, _ in resultlistdata if val and val>=0)
3
或者,您也可以在生成器表达式中使用
if
过滤器,如下所示:

>>> sum(1 for _, _, val, _ in resultlistdata if val and val>=0)
3

谢谢你,摩西,当它像这样“为我完成”的时候,看起来很简单!我认为写“Ifx[2]”相当于写“Ifx[2]为真”,我从来没有想过会这样,因为它是一个空字符串,我还以为将它放在生成器表达式中意味着每次都会运行两个“测试”,因此我仍然会得到错误。但情况显然不是这样,您建议的代码工作得非常好-再次感谢您@保罗很高兴我能帮上忙。谢谢你,摩西——像这样的“为我做”看起来很简单!我认为写“Ifx[2]”相当于写“Ifx[2]为真”,我从来没有想过会这样,因为它是一个空字符串,我还以为将它放在生成器表达式中意味着每次都会运行两个“测试”,因此我仍然会得到错误。但情况显然不是这样,您建议的代码工作得非常好-再次感谢您@保罗很高兴我能帮忙。