检查字典键是一个整数范围

时间:2015-10-28 14:26:51

标签: python if-statement dictionary range try-catch

我正在建立制造商字典。它看起来像这样:

mfgs =     {17491: 'DS', 6543: 'AC'}

在这种情况下,我需要表示一系列整数,这些整数都指向同一制造商。 (例如1-99都是由DC制造的)

我已经看到你可以创建一个表示范围的字典键。

mfgs =     {17491: 'DS', 6543: 'AC', (1,99): 'DC'}

稍后,我将从外部文件中获取一个整数。根据遇到的值,我会将相应的制造商记录到另一个文件中。

我不清楚如何检查是否存在有效的键/值对(无论是数字还是数字范围)并记录"未知"如果在没有构建扩展的情况下找不到if / then那么考虑字典中定义的键。

似乎try / except是合适的,但是如果遇到21,则mfg [21]失败并且它不应该。

2 个答案:

答案 0 :(得分:1)

您需要的不仅仅是简单的散列图(即字典)查找。 Hashmaps查找特定键,而不是键是否在任何现有键的范围内。

您有两个简单的选择。

  1. 如果您提前知道范围,请在查找之前将整数转换为范围:

    def range_from_id(manufacturer_id):
        if 1 <= manufacturer_id <= 99:
            return (1, 99)
        return manufacturer_id
    
    manufacturer_id = ... from file ...
    manufacturer_range = range_from_id(manufacturer_id)
    manufacturer = mfgs.get(manufacturer_range, "Unknown")
    
  2. 如果不这样做,则在单独的字典中跟踪范围,并遍历所有可能的值:

    mfgs = {17491: 'DS', ...}
    mfg_ranges = {(1, 99): 'DC', ...}
    
    def lookup_manufacturer(manufacturer_id):
        # direct look-up:
        if manufacturer_id in mfgs: 
            return mfgs[manufacturer_id]
    
        # range look-up:
        for (start, end), mfg in mfg_ranges.items():
            if start <= manufacturer_id <= end:
                return mfg
    
        return "Unknown"
    

    如果速度很重要,请注意此选项将显示O(n),其中n是您拥有的范围数。更合适的方法是使用二叉树,如amit answered here。这需要使用像bintrees这样的第三方库。

答案 1 :(得分:0)

我找到了一种方法来做到这一点。请注意我在那里是因为我们正在循环迭代找到的项目。 mfgs是一个预先填充的字典。

try:
    drivers_list[i]['mfg'] = mfgs[mfg] # Attempt to store in dictionary
except:
    if 1 <= mfg <= 31:   # On exception, see if it's the known mfg.
        drivers_list[i]['mfg'] = 'The known manufacturer'  # Between 1 and 31
    else:
        drivers_list[i]['mfg'] = 'Unknown' # otherwise post unknown
相关问题