具有以下字典列表:
[ {'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'},
<...> ]
如果还有其他元素,我需要对列表的每个字典进行比较:
这可以通过传统的方式使用外部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')))])
但这不起作用(也不是最佳选择)
答案 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
来包含它们,当然会更好。