我正在尝试使用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”的值作为“从未打开”的交易的利润,因为稍后当我做平均时它会扭曲我的结果(?!)。
感谢任何可以帮助我的人!
答案 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