在lis中搜索不同的dict

2024-05-17 00:06:18 发布

您现在位置:Python中文网/ 问答频道 /正文

使用以下目录:

[ {'isn': '1', 'fid': '4', 'val': '1', 'ptm': '05/08/2019 14:22:39', 'sn': '111111'  'procesado': '0'}, 
 {'isn': '1', 'fid': '4', 'val': '0', 'ptm': '05/08/2019 13:22:39', 'sn': '111111', 'procesado': '0'},
<...> ] 

如果列表中有其他元素,我需要对每个dict进行比较:

  • 等fid
  • 相等序号
  • 独立值(如果val(elemX)=0,则val(elemY)=1)
  • 不同的ptm(如果val=0,则elemX的ptm<;elemY的ptm)

这可以用一种传统的方式来实现,即使用一个外部for-internal-while循环,但这并不是实现这一点的最佳方式。你知道吗


为了找到一种方法,我尝试了这样的方法:

   for p in lista:
        print([item for item in lista if ((item["sn"] == p["sn"]) & (item["val"] == 0) & (p["val"] == 1) & (
               datetime.strptime(item["ptm"], '%d/%m/%Y %H:%M:%S') < datetime.strptime(p["ptm"],'%d/%m/%Y %H:%M:%S')))])

但这不起作用(也不是最佳的)


Tags: 方法infordatetime方式valitemptm
1条回答
网友
1楼 · 发布于 2024-05-17 00:06:18

只需构建一个从(fid,sn,val)到候选列表的映射(整个dict,它的索引,或者只是它的ptm(如下所示),这取决于您需要的输出)。还要检查它的对数值(在(fid,sn,!val)下)是否已经存在,如果已经存在,则进行ptm比较:

seen={}
for d in dd:
  f=d['fid']; s=d['sn']; v=int(d['val'])
  p=datetime.strptime(d['ptm'],'%d/%m/%Y %H:%M:%S')
  for p0 in seen.get((f,s,not v),()):
    if p0!=p and (p0<p)==v: …
  seen.setdefault((f,s,v),[]).append(p)

如果有大量值具有相同的键,则可以使用树来加速ptm比较,但这在这里似乎不太可能。对单个值使用实数据类型,或者使用namedtuple来包含它们,当然会使这变得更好。你知道吗

相关问题 更多 >