如何解决如何以更少的延迟动态格式化字典的嵌套列表
我需要您的专业知识来简化嵌套字典的格式。我有一些输入信号列表,需要根据分钟精度在u_id和timestamp字段上进行分组,并转换为相应的输出格式。我已经发布了我尝试过的格式。我需要尽可能快地轻松格式化和处理它,因为这涉及到时间的复杂性。非常感谢。
代码段
final_output = []
sorted_signals = sorted(signals,key=lambda x: (x['u_id'],str(x['start_ts'])[0:8]))
data = itertools.groupby(sorted_signals,calendar.timegm(time.strptime(datetime.utcfromtimestamp(x['start_ts']).strftime('%Y-%m-%d-%H:%M'),'%Y-%m-%d-%H:%M'))))
def format_signals(v):
result =[]
for i in v:
temp_dict = {}
temp_dict.update({'timestamp_utc': i['start_ts']})
for data in i['sign']:
temp_dict.update({data['name'].split('.')[0]: data['val']})
result.append(temp_dict)
return result
for k,v in data:
output_format = {'ui_id': k[0],'minute_utc': datetime.fromtimestamp(int(k[1])),'data': format_signals(v),'processing_timestamp_utc': datetime.strptime(datetime.utcNow().strftime("%Y-%m-%d %H:%M:%s"),"%Y-%m-%d %H:%M:%s")}
final_output.append(output_format)
print(final_output)
输入
signals = [
{'c_id': '1234','u_id': 288,'f_id': 331,'sign': [{'name': 'speed','val': 9},{'name': 'pwr','val': 1415}],'start_ts': 1598440244,'crt_ts': 1598440349,'map_crt_ts': 1598440351,'ca_id': 'AT123','c_n': 'demo','msg_cnt': 2,'window': 'na','type': 'na'},{'c_id': '1234','val': 10},'val': 1416}],'start_ts': 1598440243,'u_id': 287,'val': 1417}],'start_ts': 1598440344,'sign': [{'name': 'speed.','val': 8.2},'val': 925}],'start_ts': 1598440345,'ca_id': 'AT172','type': 'na'}
]
当前输出
[{
'ui_id': 287,'minute_utc': datetime.datetime(2020,8,26,16,42),'data': [{
'timestamp_utc': 1598440344,'speed': 10,'pwr': 1417
}],'processing_timestamp_utc': datetime.datetime(2020,29,19,35,46)
},{
'ui_id': 288,40),'data': [{
'timestamp_utc': 1598440244,'speed': 9,'pwr': 1415
},{
'timestamp_utc': 1598440243,'pwr': 1416
}],'data': [{
'timestamp_utc': 1598440345,'speed': 8.2,'pwr': 925
}],46)
}]
必需的输出
[{
'ui_id': 287,'f_id': 311,'c_id': 1234,46)
}]
解决方法
因此,让我们定义一个简单的函数,该函数将从每个对象键中提取分组所需的键:
def extract(obj):
return obj['u_id'],obj['f_id'],obj['c_id'],obj['start_ts'] // 60 * 60
注意:为实现“分钟精度”,我将时间戳分为60,以减少秒数,再乘以60,以获得有效的时间戳。
然后将对象分组并形成最终列表:
from itertools import groupby
from datetime import datetime
...
final_output = []
for (uid,fid,cid,ts),ss in groupby(sorted(signals,key=extract),extract):
obj = {
'ui_id': uid,'f_id': fid,'c_id': int(cid),'minute_utc': datetime.utcfromtimestamp(ts),'data': [],'processing_timestamp_utc': datetime.utcnow()
}
for s in ss:
obj['data'].append({
'timestamp_utc': s['start_ts'],**{i['name']: i['val'] for i in s['sign']}
})
final_output.append(obj)
要以可读的形式打印final_output
,我们可以使用pprint
:
from pprint import pprint
...
pprint(final_output,sort_dicts=False)
,
也许这可以帮助您以更直接的方式编写代码。如果您可以只浏览信号并将它们组织成一个循环,则可能不需要繁重的排序和分组依据。
当您要基于u_id收集信号时,可以使用字典方便地为每个u_id获取一个条目。这样就可以了,您只需要添加以下基于信号的有组织命令创建输出:
const test = await this.http.post(HostedPathConst.HostedPath + `CompanyProfile/UpdateCustomersStatus`,fData)
.toPromise().then((data)=>{
this.Switch = IsActive;
return this.Switch;
}).catch((error)=>{
this.Switch = !IsActive;
return this.Switch;
});
console.log(test); //Same result as below
console.log(this.Switch); //Same result as above
可在此处执行,并在下面粘贴输出https://repl.it/repls/ShallowQuintessentialInteger
organized = {}
for s in signals:
u_id = s['u_id']
entry = organized.get(u_id,None)
if entry is None:
entry = []
organized[u_id] = entry
entry.append(s)
pprint.pprint(organized)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。