检查字典键是否填充了2个数字的列表

时间:2012-05-18 03:27:59

标签: python

我有一本字典:

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 个答案:

答案 0 :(得分: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)

答案 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