我有一本字典:檢查辭典鍵充滿了2號的列表
self.currently_occupied = {obj:[0, 0]}
我需要檢查,如果obj的值包含在列表中比兩個數字以外的任何
例子:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
我有一本字典:檢查辭典鍵充滿了2號的列表
self.currently_occupied = {obj:[0, 0]}
我需要檢查,如果obj的值包含在列表中比兩個數字以外的任何
例子:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
我的解決方案是基於@捷爾的解決方案很大程度上,但我加入了一個細節。只需使用是isinstance
會導致一些列出了不是由數字來限定的。例如:
[float('nan'), float('inf')]
將有資格,因爲技術上對以上值是float
;然而,他們不是數字;因此我們需要添加一個附加條件來控制它。
import numpy as np
def check(x):
if isinstance(x,list):
if len(x) == 2:
if all(isinstance(ele, (int, float)) and np.isinf(ele) == False and np.isnan(ele) == False for ele in x):
return True
return False
結果:
>>> check([2,3])
True
>>> check([4, float('inf')])
False
編輯:
我覺得用isfinite
使得代碼更清潔,而且我也認爲我們不需要在這種情況下使用isinstance
。由此產生的代碼將是:
def check(x):
if isinstance(x,list):
if len(x) == 2:
if all(np.isfinite(ele) for ele in x):
return True
return False
這個怎麼樣測試:
(len(d[obj]) == 2) and isinstance(d[obj][0], int) and isinstance(d[obj][1], int)
isinstance(d[obj][1], (float, int))
將檢查都int
和float
,和long
也可以添加。
這說明哪些需要測試,如何滿足OP請求,雖然測試可以與巧妙的語法無疑多種方式縮短。
UPDATE:正如所指出的/由@Akavall建議的,在情況下,測試需要包括,這是一個列表,下面可以用一個and
預先考慮到測試以上:
isinstance(d[obj], list)
嘗試:
def two_int_list(value):
return isinstance(value, list) and len(value) == 2 and \
all(map(lambda x: isinstance(x, int), value))
def validate_dict_key(dictionary, key, valid=two_int_list):
return key in dictionary and valid(dictionary[key])
validate_dict_key({'obj': [58, -234]}, 'obj') # True
validate_dict_key({'obj': [32]}, 'obj') # False
validate_dict_key({'obj': (58, -234)}, 'obj') # False; only accepts list objects, not sure if this is what you want
... Downvoter?是因爲醜陋的lambda?嘆息...我會擺脫它... –
讓我們快速看看如何可以在漂亮的蟒蛇來實現:
def foo(currently_occupied):
return all(isinstance(item, list)
and len(item) == 2
and all (isinstance(subitem, int)
for subitem in item)
for item in currently_occupied.itervalues())
現在,讓我告訴你,你不應該在Python中實現這種檢查。這裏的理念是鴨打字:如果它走起來像鴨子,併發出像鴨子,那麼它的鴨子。
如果它是一個列表,並有兩個整數你不問對象。您將它編入索引,就好像它是一個列表,將第一個元素作爲整數使用。如果有什麼不成功的話,不是你的錯,是來電者的錯。
最多,你可以嘗試/捕獲類型錯誤,並用一個更具描述性的消息再次引發他們,但不要去驗證一切的類型。
它是否浮動或整數? – Akavall
它是否必須是一個列表對象,或者是任何可迭代的工作? –
如果k是一個數字會怎麼樣? –