具有相似键的三个字典的值的计算表达式

2024-06-10 22:00:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个具有类似键的字典,我想用它们的值进行一些计算。你知道吗

dict1 = {key1: 1, key2: 2, key3: 3}
dict2 = {key1: 10, key2: 10, key3: 10}
dict2 = {key1: 1, key2: 2, key3: 3}

如何使用python查找具有以下结果的词典:

dict1.values() / ((dict2.values() - dict3.values())*100)

我在寻找这样的结果:

resultdict = {key1: .00111111, key2: .0025, key3: .00428571}

我成功地用两本字典按以下方式进行了计算,但我不知道如何包括第三本字典:

finaldict = {}
for key in (dict1.viewkeys() | dict2.viewkeys()):
    if key in dict1: finaldict.setdefault(key, []).append(dict1[key][0])
    if key in dict2: finaldict.setdefault(key, []).append(dict2[key])
for lst in finaldict.values():
    if not lst[0] == 0:
        lst[0] = (float(lst[1]) / float(lst[0]))*100
        del lst[-1]

Tags: keyinforif字典valueskey2key1
3条回答

假设dict1中的键与dict2dict3中的键相同,这应该是一个简单的解决方案:

dict1 = {'key1': 1, 'key2': 2, 'key3': 3}
dict2 = {'key1': 10.4, 'key2': 10, 'key3': 10}
dict3 = {'key1': 10.4, 'key2': 2, 'key3': 3}

finaldict = {}
for key in dict1.keys():
    denom = float(dict2[key]) - float(dict3[key])
    if denom == 0.0: # or denom <= 0.0
      continue # skips over 'key1' because it can't do division by 0
    finaldict[key] = dict1[key] / (denom * 100)

print finaldict 
#  {'key3': 0.004285714285714286, 'key2': 0.0025}

Rob已经提到了如何找到值,但是您还需要另外一件事,那就是如何获得常见的密钥。您可以尝试以下技巧:

In [240]: allK = map(set, map(lambda m: m.keys(), dicts))

In [241]: allK
Out[241]: [{'key1', 'key2', 'key3'}, {'key1', 'key2', 'key3'}, {'key1', 'key2', 'key3'}]

In [242]: reduce( lambda m, n: m&n, allK  )
Out[242]: {'key1', 'key2', 'key3'}

然后,用这些键代替Rob提到的dict1中的键。你知道吗

编辑:

忘了提

dicts = [dict1, dict2, dict3]

你需要这样做。如果你对大量的字典感到特别懒惰,而且它们的编号方式与你所描述的一样整齐,那么你总是可以作弊:

In [247]: eval( '[' + ', '.join([ 'dict%d'%i  for i in range(1,4)]) + ']' )
Out[247]:
[{'key1': 1, 'key2': 2, 'key3': 3},
 {'key1': 10, 'key2': 10, 'key3': 10},
 {'key1': 1, 'key2': 2, 'key3': 3}]

如果你使用听写理解,这是很容易想到的,比如:

finaldict = { k: float(dict1[k]) / ((dict2[k]-dict3[k])*100) for k in dict1}

=右边的表达式是dict理解。它创建一个diction并用循环的结果填充。在本例中,我们循环所有键for k in dict。这个键:值对根据公式计算:k: dict1/dict2...。你知道吗

完整程序:

key1, key2, key3 = 'key1', 'key2', 'key3'
dict1 = {key1: 1, key2: 2, key3: 3}
dict2 = {key1: 10, key2: 10, key3: 10}
dict3 = {key1: 1, key2: 2, key3: 3}
finaldict = { k: float(dict1[k]) / ((dict2[k]-dict3[k])*100) for k in dict1}
print finaldict

或者,如果您担心键列表可能不同,请使用键视图的交集(&)。这将产生一个set,它只列出公共键。你知道吗

key1, key2, key3 = 'key1', 'key2', 'key3'
dict1 = {'extra': 42, key1: 1, key2: 2, key3: 3}
dict2 = {key1: 10, key2: 10, key3: 10}
dict3 = {key1: 1, key2: 2, key3: 3}

keys = dict1.viewkeys() & dict2.viewkeys() & dict3.viewkeys()
finaldict = { k:float(dict1[k]) / ((dict2[k]-dict3[k])*100) for k in keys }
print finaldict

当然,有时仅仅表达一种理解是不够的。始终可以切换回循环:

key1, key2, key3 = 'key1', 'key2', 'key3'
# Note: dict2[key3]==dict3[key3], which will cause a divide-by-zero error.
dict1 = {'extra': 42, key1: 1, key2: 2, key3: 3}
dict2 = {key1: 10, key2: 10, key3: 3}
dict3 = {key1: 1, key2: 2, key3: 3}

finaldict = {}
for k in dict1.viewkeys() & dict2.viewkeys() & dict3.viewkeys():
    try:
        finaldict[k] = float(dict1[k]) / ((dict2[k]-dict3[k])*100)
    except ZeroDivisionError:
        pass  # Skip divide-by-zero errors!
print finaldict

相关问题 更多 >