2012-03-31 47 views
1

这可能是一个非常天真的问题。我想通过比较两个库的值:减法值两个字典python

distance = dictionary1[position] - dictionary2[position] 

,但它不能正常工作,它给我的dictionary1的第一个值。

我也试图与:

set distance = set(dictionary1[position]) - set(dictionary2[position]) 

,但得到了同样的结果。

任何想法如何从两个字典的值可以减去?

字典1和2是这样的:

dictionary1 = {'chr1': '3434351', 'chr10': '5329532', 'chr11': '2355620', 
       'chr12': '40841359', 'chr13': '101523938', 'chr14': '453255816', 
       'chr17': '491453323', 'chr18': '22361089', 'chr19': '34965774', 
       'chr2': '16025716', 'chr20': '295671539', 'chr21': '2067974'} 

dictionary2 = {'chr1': '15845763', 'chr10': '186537818', 'chr11': '3715102', 
       'chr12': '1138647613', 'chr13': '123235062', 'chr14': '68159413', 
       'chr15': '51790735', 'chr16': '19324170', 'chr17': '78184979', 
       'chr18': '76968073', 'chr19': '37299170', 'chr2': '18329102', 
       'chr20': '31934245', 'chr22': '32679692'} 
+2

你的问题不是很清楚,我。请举例输入和输出。 – 2012-03-31 22:11:45

+0

你可以发布'print dictionary1'和'print dictionary2'的输出吗? – Blender 2012-03-31 22:13:29

+0

如果字典中的值具有在其上定义的减法,那么这应该起作用。然而,它不起作用,所以我们需要知道字典中有什么样的价值。 – aaronasterling 2012-03-31 22:13:49

回答

0

我不得不使用一种解决方法来解决其不是在两个字典密钥的问题。你应该在你方便的时候照顾这个。当密钥不存在时,我将该值设置为零。

keys = dictionary1.keys() 
keys.extend(dictionary2.keys()) 

keys = set(keys) 
dic = dict() 
for key in keys: 
    dic[key] = int(dictionary1.get(key,0)) - int(dictionary2.get(key,0)) 

print dic  

产量:

{'chr2': -2303386, 'chr1': -12411412, 'chr21': 2067974, 'chr13': -21711124, 'chr 
12': -1097806254, 'chr11': -1359482, 'chr10': -181208286, 'chr17': 413268344, 'c 
hr16': -19324170, 'chr15': -51790735, 'chr14': 385096403, 'chr20': 263737294, 'c 
hr22': -32679692, 'chr19': -2333396, 'chr18': -54606984} 

编辑作为尼克拉斯B.表示他的评论也coud使用dictionary comprehensions。然而,他们不可用蟒蛇< 2.7。

+1

此代码相当于集合(d1)中的k的'dic = {k:int(d1.get(k,0)) - int(d2.get(k,0))。设置(d2)}'。欢呼声:) – 2012-03-31 23:32:09

+0

@NiklasB。对于集合中的k(d1)|设置(d2)'我喜欢那个! – joaquin 2012-04-01 05:57:27

0
dictionary1 = {'chr1': '3434351', 'chr10': '5329532', 'chr11': '2355620', 
      'chr12': '40841359', 'chr13': '101523938', 'chr14': '453255816'} 
dictionary2 = {'chr1': '15845763', 'chr10': '186537818', 'chr11': '3715102', 
      'chr12': '1138647613', 'chr13': '123235062', 'chr14': '68159413'} 

dictionary3 = {} 

# Assuming dictionary1 and dictoinary2 are the same size and have the same key 
for key in dictionary1.keys(): 
    if key in dictionary1: 
     if key in dictionary2: 
      # Calculate the new value for dictionary3, by using int() 
      newValue = int(dictionary1[key]) - int(dictionary2[key]) 
      dictionary3[key] = newValue 
     else: 
      print(key, 'is not in dictionary2') 
    else: 
     print(key, 'is not in dictionary1') 

print(dictionary3) 

输出

{'chr1': -12411412, 'chr13': -21711124, 'chr12': -1097806254, 
'chr11': -1359482, 'chr10': -181208286, 'chr14': 385096403} 

我认为你可以使用int(),然后你可以把它们作为整数。我认为这是做这件事的最直接的方法之一。当然,提供检查以确保存在相同的密钥(chr1x)也是不错的主意,否则它会给你错误,或者你必须弄清楚什么。

3

使用字典理解:

{ k:int(dic1[k]) - int(dic2[k]) for k in dic1 if k in dic2 } 

或者Python的< 2.7:

dict((k,int(dic1[k]) - int(dic2[k])) for k in dic1 if k in dic2) 
+0

让我们来反过来。我刚刚编辑了你的答案。 – 2012-03-31 23:38:46