1 Вопрос: в поисках отчетливого слова в списке

вопрос создан в Wed, May 8, 2019 12:00 AM

Со следующим списком запросов:

[ {'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 (если val = 0 для elemX, то ptm для elemX < ptm для elemY)

Это можно сделать традиционным способом, используя внешний цикл 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
  1. Этот & не является and в Python.
    2019-05-08 16: 20: 26Z
  2. 2019-05-08 16: 22: 44Z
1 ответ                              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 для их хранения, конечно, сделало бы это намного приятнее.

    
1
2019-05-09 03: 33: 25Z
  1. Спасибо за вашу помощь:)
    2019-05-09 06: 56: 57Z
источник размещен Вот