是否存在可以比较字典值的内置函数,例如内置的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
答案 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))
这里无需返回True
或False
;我们检测到在选择默认大小写时没有键使测试失败,我们将True
或False
的值替换为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
。