无法将字符串转换为在生成器中浮动

时间:2017-07-04 18:04:06

标签: python list-comprehension nested-lists

我正在尝试使用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:无法将字符串转换为浮动”。

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

有没有办法使用'单线'列表理解方法进行计数,还是需要进行循环?

“resultslistdata”是由我编写的,所以如果有一些聪明的东西我可以在创建时做,这将有助于我尝试一下。我不愿意输入一个“0”的值作为“从未打开”的交易的利润,因为稍后当我做平均时它会扭曲我的结果(?!)。

感谢任何可以帮助我的人!

3 个答案:

答案 0 :(得分:0)

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

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

在尝试float演员表之前,首先检查字符串是否为 falsy ,即为空白。

答案 1 :(得分:0)

使用python 3.5我可以这样做:

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

我不知道这是否仍然适用于早期版本的python。

答案 2 :(得分:0)

您可以将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