【问题标题】:How to check all item in your list如何检查列表中的所有项目
【发布时间】:2015-04-22 06:29:03
【问题描述】:

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

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 声明。

【问题讨论】:

  • 对于你给出的样本数据,你想要False作为输出,对吧?
  • @thefourtheye,完全正确
  • I don't want use for statement. - 有什么具体原因吗?
  • @thefourtheye 因为一句话很漂亮
  • 虽然仅在 Python 2 中,并且仅因为 filter 的行为。你应该做类似any(x['id'] == _id for x in roles)

标签: python list python-2.7 dictionary


【解决方案1】:

感谢大家

def check(_list):
    return all(map(has_id, list))

print check(l)

False

【讨论】:

    【解决方案2】:

    您可以使用map 函数来检查每个角色的id 是否在l 中,然后将其组合为all 函数,像这样

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

    注意:这里我们用in操作符检查id是否在l中。在列表中,它将进行线性检查。如果您可以将您的l 转换为集合,它将非常快,因为集合使用散列来查找项目。


    这里更好的解决方案是使用生成器表达式。在 Python 2.x 中,map 实际上会生成一个列表,但我们可能不需要创建整个列表,因为如果l 中至少有一个 id 不存在,我们可以返回Falseall 将迭代生成器表达式,逐个获取值,如果当前元素不是 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
    

    【讨论】:

      【解决方案3】:

      如果您想检查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
      

      注意这个答案没有使用循环,我认为它最接近你想要的。你也可以使用其他内置函数,如 allany 但他们使用python for在源码中循环!

      这是all 函数:

      def all(iterable):
          for element in iterable:
              if not element:
                  return False
          return True
      

      【讨论】:

      • map(itemgetter('id')) 而不是 lambda?
      • @JohnLaRooy 是的,我只是在想这个! ;)
      【解决方案4】:

      您可以使用map 函数方法,例如:

      >>> l = ["25", "80"]
      >>> print map(has_id, l)
      >>> [True, False]
      

      map(function, sequence) 为序列的每个项目调用 function(item) 并返回一个返回值列表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-16
        • 2013-02-17
        相关资源
        最近更新 更多