我有一个这样的字典列表:
roles = [
{
"name": "project_management",
"id": "25"
},
{
"name": "pm.project",
"id": "26"
}
]
我想检查主列表中包含id
的另一个列表中的每个项目。
另一个清单可能是这样的:
l = ['25', '80']
我写了一个函数来查找列表中的id
:
def has_id(_id):
return bool(filter(lambda x: x['id'] == _id, roles))
现在,我如何编写一个语句来返回True
或False
以获取主列表中的其他列表。
我不想使用for
声明。
答案 0 :(得分:3)
感谢所有
def check(_list):
return all(map(has_id, list))
print check(l)
False
答案 1 :(得分:3)
您可以使用map
函数检查每个角色的id
是否在l
中,然后合并all
函数,就像这样< / p>
>>> l = ['25', '80']
>>> all(map(lambda x: x["id"] in l, roles))
False
>>> l = ['25', '26']
>>> all(map(lambda x: x["id"] in l, roles))
True
注意:我们在此处检查ID是否位于l
in
运算符中。在列表中,它将进行线性检查。如果你可以将你的l
转换成一个集合,它会非常快,因为集合使用哈希来查找项目。
这里更好的解决方案是使用生成器表达式。在Python 2.x中,map
实际上会生成一个列表,但我们可能不需要创建整个列表,因为如果至少有一个ID不存在,我们可以返回False
在l
。 all
将迭代生成器表达式,逐个获取值,如果当前元素不是Truthy,它将立即返回False
,否则它将检查下一个元素。
(注意:我知道它中有for
,但它不会完全执行。它只是按需执行。
>>> l = ['25', '80']
>>> all(role["id"] in l for role in roles)
False
>>> l = ['25', '26']
>>> all(role["id"] in l for role in roles)
True
答案 2 :(得分:1)
如果您想检查l
中的所有元素,可以使用set.intersection
,如下所示:
>>> l = ['25', '80']
from operator import itemgetter
>>> bool(set(map(itemgetter('id'),roles)).intersection(l)==set(l))
False
>>> l = ['25', '26']
>>> bool(set(map(itemgetter('id'),roles)).intersection(l)==set(l))
True
注意这个答案没有使用循环,我认为它最接近你想要的。你也可以使用其他内置函数,如all
和{{但是他们在源代码中使用了python any
循环!
这是all函数:
for
答案 3 :(得分:0)
您可以使用map函数方法,如:
>>> l = ["25", "80"]
>>> print map(has_id, l)
>>> [True, False]
map(function, sequence)
为每个序列的项调用函数(item),并返回一个返回值列表。