2012-05-18 54 views
4

我有一本字典:檢查辭典鍵充滿了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 
+4

它是否浮動或整數? – Akavall

+0

它是否必須是一個列表對象,或者是任何可迭代的工作? –

+0

如果k是一個數字會怎麼樣? –

回答

0

我的解決方案是基於@捷爾的解決方案很大程度上,但我加入了一個細節。只需使用是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 
4

這個怎麼樣測試:

(len(d[obj]) == 2) and isinstance(d[obj][0], int) and isinstance(d[obj][1], int) 

isinstance(d[obj][1], (float, int))將檢查intfloat,和long也可以添加。

這說明哪些需要測試,如何滿足OP請求,雖然測試可以與巧妙的語法無疑多種方式縮短。

UPDATE:正如所指出的/由@Akavall建議的,在情況下,測試需要包括,這是一個列表,下面可以用一個and預先考慮到測試以上:

isinstance(d[obj], list) 
+0

它應該是'isinstance'而不是'isintance' – Akavall

+0

@Aavour哎呀,錯字,謝謝你抓住了! – Levon

+1

我想我曾經告訴過一位老師:「我想成爲一名工程師,而不是編譯器!」 – slezica

0

嘗試:

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 
+0

... Downvoter?是因爲醜陋的lambda?嘆息...我會擺脫它... –

1

讓我們快速看看如何可以在漂亮的蟒蛇來實現:

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中實現這種檢查。這裏的理念是鴨打字:如果它走起來像鴨子,併發出像鴨子,那麼它的鴨子。

如果它是一個列表,並有兩個整數你不問對象。您將它編入索引,就好像它是一個列表,將第一個元素作爲整數使用。如果有什麼不成功的話,不是你的錯,是來電者的錯。

最多,你可以嘗試/捕獲類型錯誤,並用一個更具描述性的消息再次引發他們,但不要去驗證一切的類型。