Python 3.x Python字典,使范围与其值关联并返回它们

Python 3.x Python字典,使范围与其值关联并返回它们,python-3.x,Python 3.x,喂,我有一本字典 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,SecondRang

喂,我有一本字典

 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
随机导入
def W(D):
vv=0
f=0
mer=''
ran=随机均匀(0,1)
DI=D.项目()
对于DI中的k,v:
mer=''
如果(ran>=f)和(ran

当生成的浮点值落在第三个键的范围内(即
(0.50,0.75)
)时,My函数从不返回第三个键,而是返回第四个键。

dict是无序的,因此如果您想保持某种顺序,则需要一个,这将根据键顺序上的范围增加来查找范围内的键,这要求您添加按值排序的键:

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
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
如果值不完全相同,则需要进行排序,您可以使用作为键按值对项目进行排序:

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

你只生成一个随机数?此外,dict是无序的,因此不知道第一个键,除非您对数据进行排序。每次运行此函数时,我只生成一个随机浮点。那么您希望随机浮点值下的最近值吗?为什么这些值没有存储为上限?你对第一个键的想法是什么?我不明白你的话。什么是第一个键?它是基于值,键。。值是否始终相等,即如果有10个键,则所有键都相等。10?你说的是字典D的给定顺序,但字典是无序的,所以没有意义。谢谢你,看看我的问题。你们几乎是我期望的,但我只需要从0开始v,第一次迭代是0,第二次迭代是0.25,第三次迭代是0.50,最后一次是0.75。我不想在这里相乘,相反,在第二次迭代时,v的值将是第一次迭代时的tot+v值,在第三次迭代时,v将是第二次迭代时的tot+v值,所以v是0.50,最后将是0。75@DumbCoder,这里没有乘法,我们所做的就是把总数从最低值累加到最高值谢谢,你又救了我一天。它返回的正是我想要的,但在我需要应用此函数的地方给出了错误的答案。我想我误解了要求。谢谢,现在可以了。我需要了解集合和操作员模块。我认为这样的模块可以节省我的时间。请给我推荐一些关于它们的链接,我可以学到一些新东西。@DumbCoder,别担心,我在文档中添加了这些链接