2016-02-12 40 views
1

说,我有一本字典Python的字典,使与它的值范围相关联,并返回他们

D = {'A':0.25,'C':0.25,'G':0.25,'T':0.25} 

字典值的总和将始终是一个。我想使范围为d每个键,这将是如下:

  • 的第一个关键:(0, D[FirstKey])

  • 第二个键(SecondRangeParameterOfFirstKey, SecondRangeParameterOfFirstKey + ValueOfSecondKey)(0.25,0.50)

  • 第三个关键是(SecondRangeParameterOfSecondKey,SecondRangeParameterOfSecondKey + ValueOfSecondKey)(0.50,0.75)

  • 第四把钥匙的范围是(0.75,1)

有一点是最后一个键的范围的最后一个参数总是1,即所有值的总和。

我生成一个0和1之间的随机数。我需要返回随机浮点数后面的键。例如,对于字典D的给定顺序,如果我生成0.63,那么我必须返回第三个关键字G,因为它的范围是(0.50,0.75)。由于字典没有排序,所以我必须按照字典的顺序和返回字典顺序返回键来计算范围。到目前为止,我编码这个问题如下:

import random 
def W(D): 
    vv = 0 
    f = 0 
    mer = '' 
    ran = random.uniform(0,1) 
    DI = D.items() 
    for k,v in DI: 
     mer = '' 
     if (ran >= f) and (ran < D[k]+vv): 
      mer = k 
      vv += v 
return mer 

我的功能不会返回时,浮子产生的下降第三键的范围是(0.50,0.75)第三键,返回键第四代替。所以,如果你想保持一定的秩序,你将需要一个OrderedDict,这将发现的基础上增加了对键顺序的范围的范围内的关键

+0

你只产生一个随机数?此外,字符串是无序的,所以除非您对数据进行排序,否则没有第一个键的想法 –

+0

每次运行此函数时,我只生成一个随机的浮点数。 – Yousuf

+0

所以你想要在随机浮动值下的最接近的值?为什么这些值不是作为上限存储的,你对第一个关键点的想法是什么? –

回答

1

日文N3 N4 N5是无序的,这需要你添加的值排序键:

from collections import OrderedDict 
od = OrderedDict((('A', 0.25), ('C', 0.25), ('G',0.25), ('T', 0.25))) 

def W(od): 
    ran = random.uniform(0, 1) 
    tot = 0 
    for k, v in od.items(): 
     if tot <= ran < v + tot: 
      return k 
     tot += v 

在循环添加print(ran, v, tot + v)

In [36]: W(od) 
0.13237220509287917 0.25 0.25 
Out[36]: 'A' 

In [37]: W(od) 
0.22239648741773488 0.25 0.25 
Out[37]: 'A' 

In [38]: W(od) 
0.2798873944681526 0.25 0.25 
0.2798873944681526 0.25 0.5 
Out[38]: 'C' 

In [39]: W(od) 
0.05933372630532163 0.25 0.25 
Out[39]: 'A' 

In [40]: W(od) 
0.776438095223963 0.25 0.25 
0.776438095223963 0.25 0.5 
0.776438095223963 0.25 0.75 
0.776438095223963 0.25 1.0 
Out[40]: 'T' 

如果值是不是你需要排序的所有相同,可以使用operator.itemgetter为重点,通过价值的项目进行排序:

from operator import itemgetter 
d = {'A': 0.35, 'C': 0.2, 'T': 0.3, 'G': 0.15} 

def W(d): 
    ran = random.uniform(0, 1) 
    tot = 0 
    # sort from lowest value to highest 
    for k, v in sorted(d.items(),key=itemgetter(1)): 
     if tot <= ran < v + tot: 
      return k 
     tot += v 

再次添加打印:

In [55]: W(d) 
0.15 0.24005200696606188 0.15 
0.2 0.24005200696606188 0.35 
Out[55]: 'C' 

In [56]: W(d) 
0.15 0.9860872247496385 0.15 
0.2 0.9860872247496385 0.35 
0.3 0.9860872247496385 0.6499999999999999 
0.35 0.9860872247496385 0.9999999999999999 
Out[56]: 'A' 

In [57]: W(d) 
0.15 0.5690026436736583 0.15 
0.2 0.5690026436736583 0.35 
0.3 0.5690026436736583 0.6499999999999999 
Out[57]: 'T' 

In [58]: W(d) 
0.15 0.28507671431234327 0.15 
0.2 0.28507671431234327 0.35 
Out[58]: 'C' 
+0

非常感谢您对我的问题的关注。你几乎是我所期望的,但我只需要从0开始,第一次迭代为0,第二次迭代为0.25,第三次迭代为0.50,最后为0.75。我不想在这里乘以,而是在第二次迭代中,v的值将是第一次迭代中的tot + v值,第三次v将是第二次迭代中tot + v的值,所以v是0.50,最后会是0.75 – Yousuf

+0

@DumbCoder,这里没有乘法,我们所做的只是累加总数,从最低值到最高值 –

+0

谢谢,你救了我的另一天。它返回的是我想要的,但给出了错误的答案,我需要应用这个函数。我想我误解了要求。 – Yousuf

相关问题