【问题标题】:.bisect not finding closest value in dictionary.bisect 没有在字典中找到最接近的值
【发布时间】:2016-02-29 19:30:25
【问题描述】:

我已经创建了一个列表:

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

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

for k  in arraynums:
    index = sd.bisect(k)
    key = sd.iloc[index]
    seq = sd[key]

但是,从这部分代码打印的键和序列不能正确识别最接近的 k 值。我不太确定出了什么问题。我认为这可能与我创建arraynums 列表的方式有关。我使用这个创建了列表:

arraynums = numpy.arange(float(middlevalue) - 0.005, float(middlevalue) + 0.005, 0.001)

编辑: 上面字典的注释:一些值是负数,每个键的输出都是相同的负值...我还使用SortedDict()对字典进行了排序

【问题讨论】:

  • 字典未排序。
  • @njzk2 我使用SortedDict(d2)对字典进行了排序
  • 为什么sd前面有'0.3875103'?我的编译器没有运行它。一个 SortedDict 就是这样创建的:stackoverflow.com/a/25988933/2734863
  • 你可能会给 SortedDict 一个未排序的字典吗?看起来您可能正在做这里提到的“这不起作用”的事情:code.djangoproject.com/wiki/SortedDict
  • @DirkHaupt 对不起。那是个错误。我已经修复了提供的字典。

标签: python numpy dictionary


【解决方案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)。最后一个值有一个问题:可以通过其他边界选择来避免。您现在只需比较最接近的并得出结论。

【讨论】:

  • 完美。谢谢你。这是有道理的:)
猜你喜欢
  • 2017-01-23
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
相关资源
最近更新 更多