我有一本字典:
self.currently_occupied = {obj:[0, 0]}
我需要检查 obj 的值是否包含列表中两个数字以外的任何内容
例子:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
我有一本字典:
self.currently_occupied = {obj:[0, 0]}
我需要检查 obj 的值是否包含列表中两个数字以外的任何内容
例子:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
这个测试怎么样:
(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 请求,尽管毫无疑问可以通过巧妙的语法以各种方式缩短测试。
更新:正如@Akavall 指出/建议的那样,如果测试需要包括这是一个列表,则可以在and
上面的测试前面加上以下内容:
isinstance(d[obj], list)
让我们快速看看如何在不错的 python 中实现这一点:
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 中实现这种检查。这里的哲学是鸭子打字:如果它像鸭子一样走路,听起来像鸭子,那么它就是鸭子。
您不会询问该对象是否是一个列表并且有两个整数。您将它作为一个列表进行索引,您获取第一个元素并将其用作整数。如果有任何故障,哎呀,不是你的错,是呼叫者的错。
最多,您可以尝试/捕获类型错误并使用更具描述性的消息重新抛出它们,但不要去验证所有内容的类型。
尝试:
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
我的解决方案在很大程度上基于@Levon 的解决方案,但我正在添加更多细节。仅仅使用 isisinstance
可以引导一些不是由数字组成的列表来限定。例如:
[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