我正在建立制造商字典。它看起来像这样:
mfgs = {17491: 'DS', 6543: 'AC'}
在这种情况下,我需要表示一系列整数,这些整数都指向同一制造商。 (例如1-99都是由DC制造的)
我已经看到你可以创建一个表示范围的字典键。
mfgs = {17491: 'DS', 6543: 'AC', (1,99): 'DC'}
稍后,我将从外部文件中获取一个整数。根据遇到的值,我会将相应的制造商记录到另一个文件中。
我不清楚如何检查是否存在有效的键/值对(无论是数字还是数字范围)并记录"未知"如果在没有构建扩展的情况下找不到if / then那么考虑字典中定义的键。
似乎try / except是合适的,但是如果遇到21,则mfg [21]失败并且它不应该。
答案 0 :(得分:1)
您需要的不仅仅是简单的散列图(即字典)查找。 Hashmaps查找特定键,而不是键是否在任何现有键的范围内。
您有两个简单的选择。
如果您提前知道范围,请在查找之前将整数转换为范围:
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")
如果不这样做,则在单独的字典中跟踪范围,并遍历所有可能的值:
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