簡體   English   中英

如果鍵與另一字典的鍵匹配,則添加一個字典的值

[英]Adding values of one dictionary if the keys match the keys of the other dictionary

我是 python 的新手。 我想就字典操作尋求您的幫助。 我想,這個問題有點基本。 但是,我有點卡住了。 我需要得到 dict2 中與 dict1 中的“JJ”值相對應的值的總和。 由於dict1中的“JJ”與鍵“A”和“B”相關聯,所以dict2中對應的值為30和100,總和為130 謝謝! Rn

我的代碼(我在第 2 步之后得到 dict2=145 中所有值的總和,而不僅僅是 A+B=130)

dict1 = {"A":"JJ", "B":"JJ", "C":"X"}
dict2 = {"A":30, "B":100, "C":15}
dict3=dict()
for (kk, vv) in dict1.items():
    ref_val="JJ"
    if vv == ref_val:
        dict3[kk] = vv
print(dict3)

total_points=0
for (kk, vv) in dict2.items(): 
    for (kk, vv) in dict3.items(): 
        total_points = sum(vv for vv in dict2.values())
print(total_points)

我希望我正確理解了這個問題。 我是這樣,這應該工作:

dict1 = {"A": "JJ", "B": "JJ", "C": "X"}
dict2 = {"A": 30, "B": 100, "C": 15}

keys = set(k for k, v in dict1.items() if v == "JJ")
total_points = sum(dict2.get(k, 0) for k in keys)

print(total_points)
  1. keys : 使用列表推導選擇值等於JJ的鍵
  2. total_points :與這些鍵對應的值是從dict2獲取並即時求和的。 如果dict2中不存在鍵中的keys (不是這種情況,順便說一句),則取 0(零)代替(因此它不會影響總和)

我喜歡另一個答案,但我可能會更籠統地解決這個問題:

from collections import defaultdict

dict1 = {"A": "JJ", "B": "JJ", "C": "X"}
dict2 = {"A": 30, "B": 100, "C": 15}

val_to_keys = defaultdict(list)

for key, val in dict1.items():
    val_to_keys[val].append(dict2.get(key, 0))

# Note that now val_to_keys contains:
# {'JJ': [30, 100], 'X': [15]}

if 'JJ' in val_to_keys:
    print(sum(val_to_keys['JJ'])) # 130
# or you can one line the print
print(sum(val_to_keys.get('JJ', []))) # 130

這樣,您只需遍歷dict1一次,就可以提取任何您想要的值。

請注意,如果您只關心總和,那么通過在初始迭代期間計算總和會更有效。 (我在這里使用普通字典而不是默認字典,只是為了展示如何使用常規字典和默認字典來做到這一點)。

dict1 = {"A": "JJ", "B": "JJ", "C": "X"}
dict2 = {"A": 30, "B": 100, "C": 15}

val_to_keys = {}

for key, val in dict1.items():
    val_to_keys[val] = val_to_keys.get(val, 0) + dict2.get(key, 0)

# Note that now val_to_keys contains:
# {'JJ': 130, 'X': 15}

if 'JJ' in val_to_keys:
    print(val_to_keys['JJ']) # 130

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM