我不知道這是否是你想要的,但dict.get
可能是答案:
>>> ub_tries = 20
>>> tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
>>> tries_dict.get(1, 'next')
'first'
>>> tries_dict.get(4, 'next')
'fourth'
>>> tries_dict.get(5, 'next')
'next'
>>> tries_dict.get(20, 'next')
'last'
>>> tries_dict.get(21, 'next')
'next'
當然,你可以在一個功能包裝這件事,以各種不同的方式。例如:
def name_try(try_number, ub_tries):
tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
return tries_dict.get(try_number, 'next')
無論如何,dict.get(key, default=None)
就像dict[key]
,但如果key
是不是會員,而不是養KeyError
,它返回default
。
至於你的建議:
使用範圍內的關鍵?
當然,你可以做到這一點(如果你在Python 2而不是3的時候,使用xrange
爲range
),但如何將它幫助?
d = { range(1, 5): '???',
range(5, ub_tries): 'next',
range(ub_tries, ub_tries + 1): 'last' }
這是完全合法的,但d[6]
是要提出一個KeyError
,因爲6
是不一樣的東西range(5, ub_tries)
。
如果你想要這個工作,你可以建立一個RangeDictionary
這樣的:
class RangeDictionary(dict):
def __getitem__(self, key):
for r in self.keys():
if key in r:
return super().__getitem__(r)
return super().__getitem__(key)
但是,這遠遠超出了「初學者蟒」,即使是這樣一個效率極其低下的,不完整的,非健壯的實現,所以我不會建議它。
尋找一種方法來生成使用該名單的一個關鍵
你是說像這樣4 ub_tries之間的值的列表?
>>> ub_tries = 8
>>> tries_dict = {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'}
>>> tries_dict.update({i: 'next' for i in range(5, ub_tries)})
>>> tries_dict
{1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'next', 6: 'next', 7: 'next', 8: 'last'}
>>> tries_dict[6]
'next'
這可行,但它可能不是一個好的解決方案。
最後,你可以使用defaultdict
,它可以讓你烤的默認值到字典,而不是將它作爲每個呼叫的一部分:
>>> from collections import defaultdict
>>> tries_dict = defaultdict(lambda: 'next',
... {1:'first', 2:'second', 3:'third', 4:'fourth', ub_tries:'last'})
>>> tries_dict
defaultdict(<function <lambda> at 0x10272fef0>, {8: 'last', 1: 'first', 2: 'second', 3: 'third', 4: 'fourth'})
>>> tries_dict[5]
'next'
>>> tries_dict
defaultdict(<function <lambda> at 0x10272fef0>, {1: 'first', 2: 'second', 3: 'third', 4: 'fourth', 5: 'next', 8: 'last'})
但是請注意,這將永久創建每個元素第一你需要它的時候 - 你必須創建一個返回默認值的函數。這使得它更適用於要更新值的情況,並且只需要將缺省值作爲起點。
你只是想找:'tries_dict.get(試試,'下一個')'? – abarnert
PS,你可以使用'range'作爲關鍵字(在Python 3中;在Python 2中,它是一個'xrange'),但我不明白這對你有什麼幫助。那麼你就必須使用'range'來做後續的查找,這會從哪裏來? – abarnert
@abarnert我沒有真正明白dict.get的意思,沒有'下一個'的關鍵,所以我怎麼能得到它? 嗯,我確實考慮了範圍(5,ub_tries),這個範圍作爲'Next'值的鍵值。 – Newbie