[英]find extra key in dict by value
我必須像這樣聽寫
new_ids = {10722774: 5537170, 10722775: 5537171, 10722776: 5537172, 10722777: 5537173, 10722778: 5537174, 10722779: 5537175, 10722780: 5537176, 10722781: 5537177, 10722782: 5537178}
old_ids = {10722773: 5537179, 10722764: 5537170, 10722765: 5537171, 10722766: 5537172, 10722767: 5537173, 10722768: 5537174, 10722769: 5537175, 10722770: 5537176, 10722771: 5537177, 10722772: 5537178}
它們中的值是相同的,只是new_ids
有 9 個,而 old_ids 有 10 個。如何找到new_ids
中存在的這個額外key
?
5537179
中的 5537179 的值在new_ids
中不存在,所以我需要獲取密鑰10722773
鑒於澄清:
new_ids = {
10722774: 5537170,
10722775: 5537171,
10722776: 5537172,
10722777: 5537173,
10722778: 5537174,
10722779: 5537175,
10722780: 5537176,
10722781: 5537177,
10722782: 5537178,
}
old_ids = {
10722773: 5537179,
10722764: 5537170,
10722765: 5537171,
10722766: 5537172,
10722767: 5537173,
10722768: 5537174,
10722769: 5537175,
10722770: 5537176,
10722771: 5537177,
10722772: 5537178,
}
# Flip key-value to value-key
flipped_old = {v: k for k, v in old_ids.items()}
flipped_new = {v: k for k, v in new_ids.items()}
flipped_combined = flipped_old | flipped_new
# Find keys that aren't shared between the flipped dicts
uncommon_keys = set(flipped_old) ^ set(flipped_new)
# Generate a dict that unflips the key-values containing only the uncommon keys
uncommon = {flipped_combined[v]: v for v in uncommon_keys}
print(uncommon)
印刷
{10722773: 5537179}
new_ids = {10722774: 5537170, 10722775: 5537171, 10722776: 5537172, 10722777: 5537173, 10722778: 5537174, 10722779: 5537175, 10722780: 5537176, 10722781: 5537177, 10722782: 5537178}
old_ids = {10722773: 5537179, 10722764: 5537170, 10722765: 5537171, 10722766: 5537172, 10722767: 5537173, 10722768: 5537174, 10722769: 5537175, 10722770: 5537176, 10722771: 5537177, 10722772: 5537178}
notLst = [k for k,v in old_ids.items() if v not in new_ids.values()]
print(notLst)
OUTPUT
[10722773]
new_ids = {10722774: 5537170, 10722775: 5537171, 10722776: 5537172, 10722777: 5537173, 10722778: 5537174, 10722779: 5537175, 10722780: 5537176, 10722781: 5537177, 10722782: 5537178}
old_ids = {10722773: 5537179, 10722764: 5537170, 10722765: 5537171, 10722766: 5537172, 10722767: 5537173, 10722768: 5537174, 10722769: 5537175, 10722770: 5537176, 10722771: 5537177, 10722772: 5537178}
notLst = {k:v for k,v in old_ids.items() if v not in new_ids.values()}
print(notLst)
Output
{10722773: 5537179}
還有更多的方法。 也是最快的方式
你也可以使用一套方法來解決問題
new_ids = {10722774: 5537170, 10722775: 5537171, 10722776: 5537172, 10722777: 5537173, 10722778: 5537174, 10722779: 5537175, 10722780: 5537176, 10722781: 5537177, 10722782: 5537178}
old_ids = {10722773: 5537179, 10722764: 5537170, 10722765: 5537171, 10722766: 5537172, 10722767: 5537173, 10722768: 5537174, 10722769: 5537175, 10722770: 5537176, 10722771: 5537177, 10722772: 5537178}
# n = set.symmetric_difference(set(new_ids.values()),set(old_ids.values()))
n = set.symmetric_difference(*map(set,(new_ids.values(),old_ids.values())))
notLst = {k:v for k,v in old_ids.items() if v in n} # both key Value
# notLst = [k for k,v in old_ids.items() if v in n] # Only key
print(notLst)
Output
{10722773: 5537179} # for both key value
[10722773] # for only key
from timeit import timeit
new_ids = {10722774: 5537170, 10722775: 5537171, 10722776: 5537172, 10722777: 5537173, 10722778: 5537174, 10722779: 5537175, 10722780: 5537176, 10722781: 5537177, 10722782: 5537178}
old_ids = {10722773: 5537179, 10722764: 5537170, 10722765: 5537171, 10722766: 5537172, 10722767: 5537173, 10722768: 5537174, 10722769: 5537175, 10722770: 5537176, 10722771: 5537177, 10722772: 5537178}
def myway():
# n = set.symmetric_difference(set(new_ids.values()),set(old_ids.values()))
n = set.symmetric_difference(*map(set,(new_ids.values(),old_ids.values())))
notLst = {k:v for k,v in old_ids.items() if v in n} # both key Value
# notLst = [k for k,v in old_ids.items() if v in n] # Only key
return notLst
def AKKway():
flipped_old = {v: k for k, v in old_ids.items()}
flipped_new = {v: k for k, v in new_ids.items()}
flipped_combined = flipped_old | flipped_new
# Find keys that aren't shared between the flipped dicts
uncommon_keys = set(flipped_old) ^ set(flipped_new)
# Generate a dict that unflips the key-values containing only the uncommon keys
uncommon = {flipped_combined[v]: v for v in uncommon_keys}
return (uncommon)
print("My way",timeit(myway,number=10000))
print("Akk way",timeit(AKKway,number=10000))
OUTPUT
My way 0.010995300021022558
Akk way 0.028010500012896955
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.