return 列表中字典键等于值的字典
return dictionaries in list where dictionary key equals value
我有一个数据库 table,其中有数千个我想合并的近似重复项。我使用 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()
然后我使用一组
找到每个患者的唯一 ID 号
chi_set = set()
for n in res:
chi_set.add(n['pat_chi_no'])
然后我计划遍历每个唯一的 pat_chi_no
和 return 匹配每个 pat_chi_no
的字典。我如何有效地做到这一点?我尝试了从 How can you print a key given a value in a dictionary for 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"]
这只是 return 一本字典,我知道在这种情况下应该有 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}
我不明白你为什么需要弄乱 dict
或类似的东西。如果你有一个字典列表,你只需要遍历并找到匹配的字典。一个简单的列表理解就可以做到:
[d for d in res if d['pat_chi_no'] == '1111111111']
我有一个数据库 table,其中有数千个我想合并的近似重复项。我使用 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()
然后我使用一组
找到每个患者的唯一 ID 号 chi_set = set()
for n in res:
chi_set.add(n['pat_chi_no'])
然后我计划遍历每个唯一的 pat_chi_no
和 return 匹配每个 pat_chi_no
的字典。我如何有效地做到这一点?我尝试了从 How can you print a key given a value in a dictionary for 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"]
这只是 return 一本字典,我知道在这种情况下应该有 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}
我不明白你为什么需要弄乱 dict
或类似的东西。如果你有一个字典列表,你只需要遍历并找到匹配的字典。一个简单的列表理解就可以做到:
[d for d in res if d['pat_chi_no'] == '1111111111']