一个范围的查找表中查找值

我要实现的最简单的问题,但到目前为止,我还没有能够让我的头围绕在Python的解决方案。

我已经建立了类似于这一个表:

501 - ASIA 1262 - EUROPE 3389 - LATAM 5409 - US

我将测试一定值,看它是否落入这些范围内时389 -> ASIA, 1300 -> LATAM, 5400 -> US 。 值大于5409应该不会返回查找值。

我通常有一个一对一的比赛,并会实现一个字典查找。

但在这种情况下,我不得不考虑这些范围,而我没有看到我的方式出了问题。

也许没有提供整体解决方案,你能提供一些意见,这将有助于我看在正确的方向?

它是非常类似于一个vlookup中的电子表格。

我会形容我的Python知识介于基础之间的中间。

提前谢谢了。

--------------解决方案-------------

您可以使用对开模块。 而不是线性搜索,这将使用二进制搜索,这将有望更快:

import bisect

places = [
(501, 'ASIA'),
(1262, 'EUROPE'),
(3389, 'LATAM'),
(5409, 'US'),
]
places.sort() # list must be sorted

for to_find in (389, 1300, 5400):
pos = bisect.bisect_right(places, (to_find,))
print '%s -> %s' % (to_find, places[pos])

将打印:

389 -> (501, 'ASIA')
1300 -> (3389, 'LATAM')
5400 -> (5409, 'US')

首先做一个排序的指标:

index = sorted(table.iteritems())

然后,使用对开找到你的关键:

_, value = bisect.bisect_left(index, (key, ''))

places = [(501,"ASIA"),(1262,"EUROPE"),(3389,"LATAM"),(5409,"US")]
places.sort()

def getSection(places,requests):
PL= len(places)
LAST=places[-1][0]
for R in requests:
for P in range(PL):
if not (R < 0 or R>LAST):#keep away integers out of range
if R<=places[P][0]:
print R,"->",places[P][1]
break
else:
break

调用到getSection,

getSection(places,(5000000,389,1300,5400,-1,6000))

给:

389 -> ASIA
1300 -> LATAM
5400 -> US

如果你只有5409的值,我只想把每一个整数,在字典中的范围,并进行正常的查询。 每个条目需要12bytes,总的就是500KB,何必呢。

下面是一些巧妙的代码来做到这一点:

places = [
(501, 'ASIA'),
(1262, 'EUROPE'),
(3389, 'LATAM'),
(5409, 'US'),
]

def make_zones( borders ):
last = 0
for n,v in borders:
for i in range(last, n+1):
yield i,v
last = i+1

zones = dict(make_zones(places))

print zones[501], zones[502]

分类:蟒蛇 时间:2012-01-01 人气:1
本文关键词: 蟒蛇,表,查找
分享到:

相关文章

  • 哈希表查找 - 完美的哈希,在C 2014-07-03

    我有一个C语言程序,我需要做的表查找. 该项目是字符串,所有在运行时的一开始就知道. 该表被初始化一次,然后抬起头来多次. 该表可以改变,但它基本上,如果应用程序开始. 我想这意味着我可以用一个完美的哈希? 这是确定要消耗一些时间哈希表初始化,因为它发生一次. 将有3项100,000之间,每一个独特的,我估计80%的病例将少于100个条目. 一个简单天真的查找是在这种情况下"不够快". (==没有人抱怨) 然而,在那里有10K +项的情况下,幼稚方法的查找速度是不可接受的. 什么是对的

  • 最佳*的方式做C语言表查找样的功能? 2014-08-07

    我必须做一个查找表转换从输入A到输出A'. 我有一个输入端的一个函数,它应该返回A". 使用数据库或平面文件是不可能的某些原因. 我有硬编码在程序本身的查找. 这将是最优化(*空明智和时间上的另定):使用一个HashMap,其中A为重点和A'的值,或在功能使用开关case语句? 该表是一个字符串字符串查找具有约60个条目的尺寸. --------------解决方案------------- 如果速度是超超有必要的话,我会考虑完美的散列. 否则,我会使用字符串数组/矢量串对,排序顺序静态创建并使

  • 如何可以通过在公式中的表查找来插入在细胞中的公式 2012-03-24

    我想要做的基于细胞1.计算由公式做,有太多的人窝在"if"语句中的值2单元格计算. 我想构建公式的一个表,然后查找配方和有它在小区2插入并计算执行. 任何人都可以提出一个办法做到这一点? 谢谢. --------------解决方案------------- Poppa111243, 你必须插入A2公式的要求,而不是公式而造成的? 我的意思是,设想一个表中说D1至F8. D1至D8包含数字1至8 E1至E8的包含所建议的8式-或者说8公式的结果 . 虽然F1到F8包含8公式,每一个单引

  • 在同一工作簿中的另一个工作表查找值 2012-10-28

    我不是很熟悉的Excel函数,所以想知道关于使用什么功能您的建议. 我有一个数据范围A1一worksheet1:X440. P列中包含了需要匹配另一个工作表中的单元(列标题)(数据范围A1:AT1)的单位. 然后匹配的值之后,需要找到一个日期/时间列中的U worksheet1在worksheet2中发现的列值最接近的匹配. 第二个工作表的数据范围是A1:AT278). 我认为这将需要一个宏做两查找. 但我甚至无需获得第二部分的问题,在第二个工作表手动找到合适的列之后的工作. 例如,基于第二工作

  • 水晶报表基于SP参数表查找 2012-12-01

    我有一个报告,该报告从存储过程显示数据行. 在报告的顶部,我想显示哪些参数被用来生成报表信息. 我的问题是,一些参数是标识为一个外键关系,但在报告中,我想要显示的说明,而不是ID. 该描述存储在一个查找表,但我不知道如何做到这一点的查找里面的水晶. 我使用的Crystal Reports 2008. 编辑:我想通了,我可以做到这一点使用子报表,但这是那种一皮塔. 我还是感激,如果有人知道的另一种方式. 我发现SQL表达式公式,但也水晶不让我使用它们,因为我的数据源是一个存储过程,而不是一个表.

  • 如何从一个表查找值,使用另一个表 2013-02-19

    我对从表中查找数据的问题,... ...有就是挽救用户4字段的表:ID,名称,用户名,电子邮件,我有另一个表中保存10个不需要从用户的领域:手机,和.. . 现在我想表2从表1中查找Id和在表格中显示的电话号码了. 注意:ID是表1和2之间的共享代码 <?php $con=mysqli_connect("localhost","blah","blah","blah"); if (mysqli_connect_errno(

  • 如何获取没有在.NET中注册表查找默认的浏览器? 2013-02-19

    有谁知道一个路该怎么走的默认浏览器,而不做一个查询上使用.NET框架的注册表? --------------解决方案------------- 好了,你可以只运行System.Diagnostics.Process.Start(url);这将启动默认浏览器,你可以再检查什么的可执行文件的过程中运行,但我不知道,如果它使因为Windows太大的差别将使用注册表,以决定哪些是默认. 为什么你要避免注册表的查找? 您可以使用AssocQueryString功能,但在内部它使用注册表来获取默认的浏览器.

  • 数据透视表查找 2013-03-19

    我有以下表 目前评级 2核心 4核心 在地面直接铺设 在单路管道 在空气 在地面直接铺设 在单路管道 在空气 6毫米<SUP> 2 </ SUP> CU 0 0 0 0 0 0 10毫米<SUP> 2 </ SUP> CU 0 0 0 0 0 0 16毫米<SUP> 2 </ SUP> CU 140 115 120 115 94 105 25毫米<SUP> 2 </ SUP> CU 180 145 160 15

  • 使用哈希表查找字符的字符串 2013-04-29

    我决定解决在字符串发现给定的字符的问题. 我解决它在两个方面: 第一个(使用哈希表来保持值ASCII因为我们要查找的字符): static void Hash(string text, char[] charsToFind) { Dictionary<int,char> chars = new Dictionary<int,char>(); foreach (var letter in charsToFind) { chars[(int)letter] = letter; } fo

  • 从其他表查找场 2013-05-26

    表名tblWorkshop有以下字段 ID自动编号 WorkshopDate日期 TimeFrom日期 TimeTo日期 WorkshopTitle文本 表名tblWorkshopEnroll有以下字段 ID自动编号 车间查找tblWorkshop表 StudentID号码 我知道如何使用查询向导研讨会现场. 然而,这tblWorkshopEnroll将用作学生形式的窗体. 当我报名的学生到车间,单击下拉显示所有的领域,但是当我松开鼠标,只有WorkshopDate节目. 我如何显示子窗体其他领

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.576 (s). 10 q(s)