内置用于字典值(不是键)的“ all()”函数

时间:2018-10-19 13:59:44

标签: python dictionary

是否存在可以比较字典值的内置函数,例如内置的all()函数可以比较列表或元组并返回True或{{1} } +它来自的字典键?

我想要实现的是给False函数一个字典而不是一个列表。 all()的默认行为是,如果缺少某个元素或该元素为假,则返回all()

True

使用香草>>> all([1,2,3,4,0]) False >>> all(['hello', 'world', '']) False >>> all(['hello', 'world', None]) False >>> all([1,2,3,4]) True >>> all(['hello', 'world']) True 函数,它仅返回all()值的True,如果我要检查这些布尔值,可以很好地进行比较。但是,我不知道哪个值是假的,以便告诉用户为什么有问题。

我已经创建了一个函数。除了布尔值之外,它还返回其值为falsey的元素的键:

False

我希望它提早退出,我们不需要测试所有值。

有内置的功能吗?如果没有,为什么不呢?似乎在各种情况下都会有用。

我将此用于函数,其中每个关键字参数的默认值均为# dictionary all function (working with 3.x) def dict_all(iterable): for key in iterable: if not iterable[key]: return False, key return True ,以在用户未设置值时提供默认值。我使用None函数在返回dict_all()时提供了错误消息。

例如:

False, key

预期结果是返回dictionary = {'jira_key' : 'REDACTED', 'summary' : 'this is a test', 'desc' : 'this is a description', 'req_type' : 'PMV', 'comp_type' : None}

对于那些反对False, 'comp_type'True作为元组返回的有用性的人,我也给您一个例子:

False

2 个答案:

答案 0 :(得分:2)

您需要做的就是遍历键值对 pairs ,这样您就可以测试该值而不必再次参考原始映射,并在该值为false时返回键。您还需要在返回类型上保持一致,并在两种情况下都返回一个元组:

def dict_all(mapping):
    for key, value in mapping.items():
        if not value:
            return False, key
    return True, None

请注意最后一行的更改,您真的不想为错误的情况返回一个元组,为真实的情况返回一个布尔值,因为那样您还必须测试返回类型,然后才能真正知道缺少什么。

对此没有“内置”功能,因为all()(和any())的设计纯粹是为了回答问题:是执行可迭代通过测试

您要提出不同的要求;您的代码需要知道第一个密钥不能通过测试

对于这个问题,我将使用next() function,并带有生成器表达式和默认值:

empty = next((key for key, value in mapping.items() if not value), None)
if empty is not None:
    raise CustomException('Missing value for {}'.format(empty))

这里无需返回TrueFalse;我们检测到在选择默认大小写时没有键使测试失败,我们将TrueFalse的值替换为empty is not None的测试。

任何独特的哨兵都能胜任; None是通常的选择,但是如果您的输入字典使用object()作为有效键,则可以使用None

_sentinel = object()
empty = next((key for key, value in mapping.items() if not value), _sentinel)
if empty is not _sentinel:
    raise CustomException('Missing value for {}'.format(empty))

答案 1 :(得分:1)

编辑:此答案是在您原始dict_all函数的上下文中编写的,然后进行编辑。

def dict_all(iterable):
    for i, e in enumerate(iterable):
        if not iterable[e]:
            return False, e
    return True

我有三句话。

首先,我不确定您是否意识到这一点,所以我要指出:您的dict_all寻找虚假的,而字典是它的键。

>>> d = {1:2, 3:0}
>>> all(d)
True
>>> dict_all(d)
(False, 3)

第二,函数中的enumerate似乎毫无意义。考虑以下生成器表达式。

>>> next(((False, key) for key, value in d.items() if not value), (True, None))
(False, 3)
>>> d = {1:2, 3:4}
>>> next(((False, key) for key, value in d.items() if not value), (True, None))
(True, None)

第三,获取实际的伪造值会比仅获得False有用吗?在这种情况下,请在上面的表达式中使用(value, key)而不是(False, key)

编辑:由于您要求提供库功能,因此可以使用itertools.dropwhile删除具有真实值的字典项。

>>> from itertools import dropwhile    
>>> from operator import itemgetter
>>> 
>>> d = {1:2, 3:4, 5:0}
>>> next((dropwhile(itemgetter(1), d.items())), None)
>>> (5, 0)

这将为您提供一个(键,值)对,其值是伪造的值或None