如何检查列表中的所有项目

时间:2015-04-22 06:29:04

标签: python list python-2.7 dictionary

我有一个这样的字典列表:

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))

现在,我如何编写一个语句来返回TrueFalse以获取主列表中的其他列表。

我不想使用for声明。

4 个答案:

答案 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不存在,我们可以返回Falselall将迭代生成器表达式,逐个获取值,如果当前元素不是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),并返回一个返回值列表。