包含整数和浮点数的列表理解的正确语法?

时间:2016-06-18 20:30:06

标签: python-3.x list-comprehension

我有一个列表如下所示(Python3):

myLOL = ["['1466279297', '703.0']", "['1466279287', '702.0']", "['1466279278', '702.0']", "['1466279268', '706.0']", "['1466279258', '713.0']"]

我正在尝试使用列表推导将每个内部列表的第一项转换为int,将第二项转换为float,以便最终得到:

newLOL = [[1466279297, 703.0], [1466279287, 702.0], [1466279278, 702.0], [1466279268, 706.0], [1466279258, 713.0]]

我正在学习列表理解,有人可以用这种语法帮助我吗?

谢谢!

[编辑 - 解释我问这个问题的原因]

这个问题是达到目的的手段 - 测试需要语法。我正在ZigBee网络上收集传感器数据,我正在使用Arduino来格式化JSON中的传感器消息。这些消息发布到在Raspberry Pi上运行的MQTT代理(Mosquitto)。 Redis服务器(也在Pi上运行)充当内存中的消息存储库。我正在编写一个服务(python-MQTT客户端)来解析JSON并将一个LoL(您在我的问题中看到的数据样本)发送给Redis。最后,我在Pi上运行Apache的仪表板。仪表板利用Highcharts动态绘制传感器数据(通过MQTT代理和浏览器之间的Web套接字连接)。加载页面后,我从Redis LoL中提取历史图表数据,以“非常快速”填充仪表板上的图表(在动态添加任何实时数据之前)。我意识到我可以按照我想要的方式在Redis商店中格式化传感器数据,但这是一个我尚未解决的问题。现在,我正试图让我的历史数据在Highcharts中正确绘制。如果数据格式正确,我可以让这件作品正常工作。

5 个答案:

答案 0 :(得分:0)

尝试:

import json
newLOL = [[int(a[0]), float(a[1])] for a in (json.loads(s.replace("'", '"')) for s in myLOL)]

这里我正在考虑列表中的每个元素作为JSON,但由于它使用'而不是"作为字符串,我必须先替换它(它只能起作用,因为你说只会有数字。)

答案 1 :(得分:0)

这可能有用吗?我希望我更聪明。

newLOL = [] 
for listObj in myLOL:
    listObj = listObj.replace('[', '').replace(']', '').replace("'", '').split(',')
    newListObj = [int(listObj[0]), float(listObj[1])]
    newLOL.append(newListObj)

通过当前列表迭代,通过替换不需要的字符串字符并在逗号上使用拆分将字符串分成列表。然后我们获取修改后的列表对象并创建另一个新的列表对象,其值为各自的int和浮点数。然后,我们将准备好的newListObj追加到newLOL列表中。考虑到您需要列表中的实际列表集。您之前记录的输入列表实际上包含字符串,看起来像列表。

答案 2 :(得分:0)

这是一种非常奇怪的格式,最好的解决方案可能会改变生成该格式的代码。

话虽如此,您可以使用ast.literal_eval 安全地将列表元素评估为Python令牌:

>>> lit = ast.literal_eval
>>> [[lit(str_val) for str_val in lit(str_list)] for str_list in myLOL]
[[1466279297, 703.0], [1466279287, 702.0], [1466279278, 702.0], [1466279268, 706.0], [1466279258, 713.0]]

我们需要做两次 - 一次将字符串转换为包含两个字符串的列表,然后每个结果字符串转换一次以将其转换为数字。

请注意,即使字符串包含其他有效标记,这也会成功。如果您也想验证格式,您需要执行以下操作:

>>> def process_str_list(str_list):
...     l = ast.literal_eval(str_list)
...     if not isinstance(l, list):
...         raise TypeError("Expected list")
...     str_int, str_float = l
...     return [int(str_int), float(str_float)]
...
>>> [process_str_list(str_list) for str_list in myLOL]
[[1466279297, 703.0], [1466279287, 702.0], [1466279278, 702.0], [1466279268, 706.0], [1466279258, 713.0]]

答案 3 :(得分:0)

好吧,你可以使用ast.literal_eval

from ast import literal_eval

myLOL = ["['1466279297', '703.0']", "['1466279287', '702.0']", "['1466279278', '702.0']", "['1466279268', '706.0']", "['1466279258', '713.0']"]

items = [[int(literal_eval(i)[0]), float(literal_eval(i)[1])] for i in myLOL]

答案 4 :(得分:0)

您的输入包含一个字符串列表,其中每个字符串都是列表的字符串表示形式。第一项任务是将字符串转换回列表:

import ast
lol2 = map(ast.literal_eval, mylol) # [['1466279297', '703.0'], ...]

现在,您只需从int获取floatlol2值:

newlol = [[int(a[0]), float(a[1])] for a in lol2]