返回列表中的字典,其中字典键等于值

moa*_*eep 0 python psycopg2

我有一个数据库表,其中包含要合并的数以千计的近似重复项。我psycopg2.extras用来执行查询并最终在字典列表中获得结果。

dict_cur = conn.cursor(cursor_factory=psycopg2.extras.RealDictCursor)
query = """SELECT DISTINCT pat_uid, pat_first_name, pat_last_name, pat_dob_dt, pat_chi_no,
       pat_addr, wtg_uid, wtg_pat_uid, std_uid, std_pat_uid, work_uid, work_pat_uid
       from ((patients left outer join waiting 
       on (pat_uid = wtg_pat_uid)) left outer join studies 
       on (std_pat_uid = pat_uid) left outer join worklist
       on (work_pat_uid = pat_uid)) 
       where (pat_first_name, pat_last_name, pat_chi_no)
       in (SELECT pat_first_name, pat_last_name, pat_chi_no from patients 
       group by pat_first_name, pat_last_name, pat_chi_no
       HAVING count(*) >= 2) AND
       pat_chi_no ~ '^[0-9]{10,10}\$'
       order by pat_last_name asc, pat_first_name asc,
       pat_dob_dt asc"""

# Execute query - find all duplicate patients
dict_cur.execute(query)
# python list containing complete query results
res = dict_cur.fetchall()
Run Code Online (Sandbox Code Playgroud)

然后我使用一组找到每个患者的唯一 ID 号

 chi_set = set()
 for n in res:
        chi_set.add(n['pat_chi_no'])
Run Code Online (Sandbox Code Playgroud)

然后我计划遍历每个唯一的pat_chi_no并返回匹配每个pat_chi_no. 我如何有效地做到这一点?我已经尝试了从如何在 Python 字典中打印给定值的键编辑的以下内容

def build_dict(seq, key):
    return dict((d[key], dict(d, index=index)) for (index, d) in enumerate(seq))

info_by_chi = build_dict(res, key="pat_chi_no")
info_by_chi["1111111111"]
Run Code Online (Sandbox Code Playgroud)

这仅返回一本字典,我知道在这种情况下应该有 4 个条目。

示例输出将是完整字典列表的子集,即列表将仅包含那些字典 lst['pat_chi_no'] == 1111111111

例如

{'index': 4218,
 'pat_addr': '10 DOWNING STREET',
 'pat_chi_no': '1111111111',
 'pat_dob_dt': datetime.date(1937, 9, 24),
 'pat_first_name': 'JOHN',
 'pat_last_name': 'DOE',
 'pat_uid': 35359,
 'std_pat_uid': 35359,
 'std_uid': 37138,
 'work_pat_uid': 35359,
 'work_uid': 366,
 'wtg_pat_uid': 35359,
 'wtg_uid': 11307}


{'index': 122,
     'pat_addr': '10 DOWNING STREET',
     'pat_chi_no': '1111111111',
     'pat_dob_dt': datetime.date(1937, 9, 24),
     'pat_first_name': 'JOHN',
     'pat_last_name': 'DOE',
     'pat_uid': 1233,
     'std_pat_uid': 3455,
     'std_uid': 2323,
     'work_pat_uid': 2455,
     'work_uid': 366,
     'wtg_pat_uid': 3455,
     'wtg_uid': 1127}
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 5

我不明白你为什么需要搞砸dict或类似的事情。如果你有一个字典列表,你只需要遍历并找到匹配的。一个简单的列表理解就可以做到:

[d for d in res if d['pat_chi_no'] == '1111111111']
Run Code Online (Sandbox Code Playgroud)