在列表中搜索不同的字典

时间:2019-05-08 16:16:41

标签: 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'},
<...> ] 

如果还有其他元素,我需要对列表的每个字典进行比较:

  • 等于fid
  • 等于sn
  • 不同的val(如果val(elemX)= 0,则val(elemY)= 1)
  • 与ptm不同(如果elemX的val = 0,则elemX的ptm

这可以通过传统的方式使用外部for循环和内部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')))])

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

1 个答案:

答案 0 :(得分:1)

只需从(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来包含它们,当然会更好。