2017-08-12 64 views
0

什么是不使用许多if语句编码pythonicly的最佳方式?最优雅的方式来检查数字是否在范围列表中,并输出一个值

如果我有例如3个范围: 1至5给出了 'A' 回 6至10给出了 'B' 回 11至15给出了 'C' 后面

我要检查,如果一个数量在这些范围内,然后给我相关的价值。

考虑使用xranges字典作为键的值。

dic = {xrange(1,5) : 'A', 
     xrange(6,10) : 'B', 
     xrange(11, 15) : 'C'} 

def test(my_num): 
    for key, val in dic.items(): 
     if my_num in key: 
      return val 

test(8) 

任何想法?

回答

0

停!在做这件事之前想一想。当你必须对字典进行线性操作的时候,你知道你做错了什么。

存储范围的键失败了词典的目的,因为它需要线性遍历和成员测试,两者都是线性的。

最简单(也是最有效)的方法是简单地解开你的范围。事情是这样的:

In [214]: ranges = [(xrange(1,5), 'A'), 
    ...:  (xrange(6,10),'B'), 
    ...:  (xrange(11, 15), 'C')] 

In [216]: dic = {} 

In [217]: for r, label in ranges: 
    ...:  dic.update({i : label for i in r}) 

你的查询应该是这样的:

{1: 'A', 
2: 'A', 
3: 'A', 
4: 'A', 
6: 'B', 
7: 'B', 
8: 'B', 
9: 'B', 
11: 'C', 
12: 'C', 
13: 'C', 
14: 'C'} 

和查找,现在恒一次。

0

我同意@COLDSPEED。这是存储该数据的低效方式。如果可能的话,你可以用不同的方法回去组装dic。作为补充,您可以使用双重理解来重写它。你不会经常看到这些,但在这里可能适合。

lookup = { 
    value: label for range, value in dic.items for value in range 
} 
相关问题