我有一个sqlite查询,它返回以下元组的python列表:
[(u'1623,0.0,1651,2.0e-06,1679,5.0e-06,1707,7.0e-06,1735,9.0e-06,1762,1.1e-05,1790,1.4e-05'),
( u'1933,458273.7,1940,460182.6,1947,464019.3,1954,465922.8,1961,467856.0,1968,479385.0')]
这里的每个字符串包含一对x,y对的元组,即一个项目是1623,0.0 我想要的输出是:
[(1623,0.0,1651,2.0e-06,1679,5.0e-06,1707,7.0e-06,1735,9.0e-06,1762,1.1e-05,1790,1.4e-05),
(1933,458273.7,1940,460182.6,1947,464019.3,1954,465922.8,1961,467856.0,1968,479385.0)]
有没有一种有效的方法来执行此翻译?
也许它可以在sql级别执行,但我不这么认为,我的查询如下:
select group_concat( COALESCE(timestamp, "")
|| COALESCE(",", "")
|| COALESCE(value, "") )
from table where type='VALUE' group by eventid;
我无法找到一种方法来连接多个列而不将其转换为字符串
答案 0 :(得分:2)
不要在SQL中分组,在Python中分组并避免必须序列化然后反序列化您的值:
from itertools import groupby
from operator import itemgetter
cursor.execute('''select eventid, timestamp, value from table
where type="VALUE" order by eventid''')
for eventid, rows in groupby(cursor, itemgetter(0)):
print eventid
for _, timestamp, value in rows:
print timestamp, value
仅当您需要聚合数据(总和,计算平均值,计数等)时才使用SQL中的分组,而不是在需要来自组的单个行进行进一步处理时。
如果您需要完全按照描述的输出(带有时间戳的元组,重复的值对),您可以使用以下内容生成输出:
from itertools import groupby
from operator import itemgetter
cursor.execute('''select eventid, timestamp, value from table
where type="VALUE" order by eventid''')
result = [tuple(chain.from_iterable(r[1:] for r in rows))
for eventid, rows in groupby(cursor, itemgetter(0))]
e.g。对于每个唯一的eventid
,都会生成一个由链式时间戳和值列组成的元组。