将字典的值相乘

Multiply values of a dictionary

我有两本词典,例如:

{"1":2,2:"5",3:"abcd",5:7}

{"1":10,2:5,3:"123",5:2.5}

我需要创建一个新字典,其中的键与前两个相同,但如果两个值都是数字,则值是键对应的值的乘积,如果它们是值,则值是值的总和是字符串。否则从答案中排除键(和值)。

所以答案会是: {"1":20,3:"abcd123",5:17.5}

现在我的代码部分如下所示:

total = {key: price * key_values[key] for key, price in key_values.items()}

在附近吗?

您的尝试有点巧妙,但 (1) 不处理类型且 (2) 不过滤。我不会在这里使用字典理解,因为过滤可能有点不方便。只需命令式地写下:

dict_a = {"1":2,2:"5",3:"abcd",5:7}
dict_b = {"1":10,2:5,3:"123",5:2.5}

dict_merged = {}
for key, value_a in dict_a.items():
    value_b = dict_b[key]
    if type(value_a) == str and type(value_b) == str:
        dict_merged[key] = value_a + value_b
    elif type(value_a) in (int, float) and type(value_b) in (int, float):
        dict_merged[key] = value_a * value_b

如果您要在其中设置条件,不建议使用字典理解。

a = {"1":2,2:"5",3:"abcd",5:7}
b = {"1":10,2:5,3:"123",5:2.5}
c = {}
for key,value in a.items():
    b_value = b[key]
    if all(isinstance(x, (int, float)) for x in [value, b_value]):
        c[key] = value * b_value
    elif all(isinstance(x, str) for x in [value, b_value]):
        c[key] = value + b_value

print(c)

输出:

{'1': 20, 3: 'abcd123', 5: 17.5}

注意:这是假设 pre-condition 你提到的两个字典总是有相同的键总是被满足

如果你真的想使用 dict comprehensions,那么做这样的事情:

d1= {"1":2,2:"5",3:"abcd",5:7}
d2= {"1":10,2:5,3:"123",5:2.5}

# filter out keys that aren't shared, and if they are shared, then make sure they have a value of the same type
d3 = {key:0 for key in set(d1.keys()).intersection(set(d2.keys())) if type(d1[key])== type(d2[key])}

# Combine the values of all the keys that remain 
d4 = { key:d1[key]+d2[key] if type(d1[key]) == str else d1[key]+d2[key]  for key in d3 }

或者,如果你愿意,你可以将它们嵌套在一行中,但它不是那么可读:

d4 = { key:d1[key]+d2[key] if type(d1[key]) == str else d1[key]+d2[key]  for key in {key:0 for key in set(d1.keys()).intersection(set(d2.keys())) if type(d1[key])== type(d2[key])} }

但这些选项的效率低于其他人建议使用的传统 for 循环,这正是我建议使用的。