1 Câu hỏi: tìm kiếm dict khác biệt trong một danh sách

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Với danh sách sau đây của dict:

[ {'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'},
<...> ] 

Tôi sẽ cần so sánh cho từng dict của danh sách nếu có yếu tố khác với:

  • fid bằng nhau
  • sn bằng nhau
  • val khác biệt (nếu val (elemX) = 0 thì val (elemY) = 1)
  • ptm riêng biệt (nếu val = 0 của elemX thì ptm của elemX < ptm của elemY)

Điều này có thể được thực hiện theo cách truyền thống bằng cách sử dụng vòng ngoài cho vòng lặp bên trong, nhưng đây không phải là cách tối ưu để thực hiện.

Cố gắng tìm cách để làm điều đó, tôi đã thử với một cái gì đó như thế này:

   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')))])

Nhưng điều này không hoạt động (và cũng không tối ưu)

    
1
  1. & này không phải là and bằng Python.
    2019-05-08 16: 20: 26Z
  2. 2019-05-08 16: 22: 44Z
  3. 2019-05-08 16: 23: 36Z
1 Câu trả lời                              1                         
. Ngoài ra, hãy kiểm tra xem có bất kỳ số đối diện nào không (dưới (fid,sn,val)) và thực hiện so sánh dict nếu vậy: ptm

Nếu bạn có số lượng lớn các giá trị với cùng một khóa, bạn có thể sử dụng cây để đẩy nhanh các so sánh (fid,sn,!val), nhưng điều đó dường như không thể xảy ra ở đây. Sử dụng kiểu dữ liệu thực cho các giá trị riêng lẻ và có lẽ là ptm để chứa chúng, tất nhiên sẽ làm cho điều này đẹp hơn rất nhiều.

    
1
2019-05-09 03: 33: 25Z
  1. Cảm ơn bạn đã giúp đỡ :)
    2019-05-09 06: 56: 57Z
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)
nguồn đặt đây