4

我有一本字典:

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

4 回答 4

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 请求,尽管毫无疑问可以通过巧妙的语法以各种方式缩短测试。

更新:正如@Akavall 指出/建议的那样,如果测试需要包括这是一个列表,则可以在and上面的测试前面加上以下内容:

isinstance(d[obj], list)
于 2012-05-18T03:35:33.967 回答
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 中实现这种检查。这里的哲学是鸭子打字:如果它像鸭子一样走路,听起来像鸭子,那么它就是鸭子。

您不会询问该对象是否是一个列表并且有两个整数。您将它作为一个列表进行索引,您获取第一个元素并将其用作整数。如果有任何故障,哎呀,不是你的错,是呼叫者的错。

最多,您可以尝试/捕获类型错误并使用更具描述性的消息重新抛出它们,但不要去验证所有内容的类型。

于 2012-05-18T03:43:58.170 回答
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
于 2012-05-18T03:36:26.587 回答
0

我的解决方案在很大程度上基于@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
于 2012-05-18T04:44:32.563 回答