将字典的值相乘
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 循环,这正是我建议使用的。
我有两本词典,例如:
{"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 循环,这正是我建议使用的。