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

时间:2014-09-24 01:19:31

标签: python dictionary

我有三个具有相似键的字典,其值我想用它来计算。

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]

3 个答案:

答案 0 :(得分:3)

如果您使用dict理解,这很容易想到,如下所示:

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

=右侧的表达是一个词典理解。它创建一个词典并填充循环的结果。在我们的例子中,我们循环所有键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

答案 1 :(得分:2)

假设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}

答案 2 :(得分:1)

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}]