如何以更少的延迟动态格式化字典的嵌套列表

如何解决如何以更少的延迟动态格式化字典的嵌套列表

我需要您的专业知识来简化嵌套字典的格式。我有一些输入信号列表,需要根据分钟精度在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?