.bisect没有在字典中找到最接近的值

时间:2016-02-29 19:30:26

标签: python numpy dictionary

我创建了一个列表:

 clm0 clm1 clm2  clm3
  1    aa   ab  ad, xx
  2    cb   ac  af, yy

和一个按键值排序的字典(这里是字典的一部分):

arraynums = [ 0.3888553  0.3898553  0.3908553  0.3918553  0.3928553  0.3938553
  0.3948553  0.3958553  0.3968553  0.3978553  0.3988553]

我一直在使用此代码查找与上面列表中列出的值最接近的值:

sd =({'0.3880434': ['GGATCG'], '0.3883449': ['TTCACG'], '0.388449': ['ATGGCG'], '0.3890966': ['ACTCGC'], '0.3893325': ['GTGGAT'], '0.3893478': ['GATACG'], '0.3900749': ['CAGAAG'], '0.3900875': ['CGAGAG'], '0.3900915': ['ATCGGG'], '0.3901032': ['CACCGG'], '0.3901743': ['AAAGAC'], '0.3906361': ['TACGGC'], '0.390682': ['CCATCG'], '0.3909258': ['GGATGA'], '0.3910728': ['AAGATA'], '0.391648': ['GCAACG'], '0.3919125': ['AGGACT', 'GATCGC'], '0.3921844': ['AGAGAA'], '0.3922956': ['CGGGAA'], '0.3927617': ['ATGGAA'], '0.3927763': ['TTGTCG'], '0.3928683': ['ACAGAC'], '0.39309': ['CGCGCT'], '0.3938553': ['AGGACG'], '0.3940998': ['AAGAGC'], '0.3941768': ['GTCGGA'], '0.394966': ['CGTTCC'], '0.395116': ['TGGAAG'], '0.3954179': ['CCGTCC'], '0.3955623': ['AATCGC'], '0.3956923': ['GGACGG']})

但是,从代码的这一部分打印的密钥和seq不能正确识别k的最接近的值。我不太清楚出了什么问题。我认为这可能与我创建for k in arraynums: index = sd.bisect(k) key = sd.iloc[index] seq = sd[key] 列表的方式有关。我用这个创建了列表:

arraynums

编辑: 上面字典的注释:一些值是负数,每个键的输出是相同的负值...我还使用arraynums = numpy.arange(float(middlevalue) - 0.005, float(middlevalue) + 0.005, 0.001)

对字典进行了排序

1 个答案:

答案 0 :(得分:1)

超出类型不匹配(sd键是str而arraynums元素是浮点数),一种有效的方法可以是:

keys=list(zip(sd.items())) 
values= array([x[0] for x in sd.values()])
indices=np.searchsorted(sorted(sd.keys()),arraynums)

In [390]: indices
Out[390]: array([ 3,  6, 13, 16, 21, 23, 26, 31, 31, 31, 31], dtype=int64)

indices说arraynums [0]在键[2]和键[3]之间等等(见searchsorted)。最后一个值只有一个问题:可以通过其他边界选择来避免它。您刚才要比较最接近的结论。