我有一个这样的字典列表:
list_of_dicts:
- name: Item1
- name: Item2
type: special
- name: Item3
- name: Item4
type: small
如您所见,并非所有项目都有type
属性。上下文:如果没有type
设置属性,则表示该项目是默认类型。
我想选择所有不是 type 的项目special
。
我试过这个:list_of_dicts | rejectattr('type', 'equalto', 'special')
不幸的是,AnsibleUndefinedVariable: 'dict object' has no attribute 'type'
由于某些项目没有类型,因此失败并出现错误。
解决这个问题的好方法是什么?
编辑:我实际上并没有足够关注@ranjandas 对现有答案的最新编辑和以下评论。我的第一个解决方案几乎相似。我猜你对第二个更感兴趣。
这里有两种不同的方法来满足您的要求。
第一个解决方案默认仅使用 ansible 中可用的过滤器:
rejectattr
您已经提到过及其对应的selectattr
. 这个想法是添加两个列表。第一个是通过选择所有没有属性的字典来制作的type
。第二个是通过选择具有type
属性的 dict 并拒绝它等于的那些special
。对于第二种解决方案,我使用了控制器上需要的
json_query
过滤pip install jmespath
器。正如您在下面看到的,它更加紧凑。这是你的选择 !
演示手册:
这使:
您应该使用
rejectattr
来拒绝type
未定义的项目并使用selectattr
来选择equalto
特殊的项目。编辑:
如何组合下面给出的两个列表?我不知道这是否是最好的方法,但它有效。