我有一本字典:
self.currently_occupied = {obj:[0, 0]}
我需要检查obj的值是否包含列表中两个数字以外的任何内容
示例:
obj:[58, -234] is ok
obj:[32] is not
obj:[] is not
obj:[4, k] is not
答案 0 :(得分:4)
这个测试怎么样:
(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)
答案 1 :(得分:1)
让我们快速了解如何在漂亮的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中实现这种检查。这里的哲学是鸭子打字:如果它像鸭子一样走路,听起来像鸭子,那么它就是鸭子。
如果对象是列表并且有两个整数,则不要询问该对象。您将其编入索引就好像它是一个列表一样,您将第一个元素作为整数使用。如果有任何失败,那就不是你的错,也就是来电者的错。
最多,您可以尝试/捕获类型错误并使用更具描述性的消息重新抛出它们,但不要验证所有类型。
答案 2 :(得分: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
答案 3 :(得分:0)
我的解决方案在很大程度上基于@Levon的解决方案,但我还要添加一个细节。只使用is 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