jinja groupby with iteritems()

时间:2018-09-18 02:08:59

标签: python ansible jinja2

我有字典

a:
    attr1: abc
    attr2: fddf
b:
    attr1: abc
    attr2: djfkdjf
...

我想按“ attr1”分组。我知道我可以做以下事情

{% for grouper in mydict.values()|groupby('attr1') %}
   something
{% endfor %}

但这不是我想要的,因为当我使用values()时,我会丢失密钥。

我需要使用iteritems(),但它会返回一个元组列表,该列表不适用于groupby

2 个答案:

答案 0 :(得分:2)

我相信dict2items | groupby('value.attr1')会做您想要的事情,尽管由于缺少items2dict,您必须手工将答案的“价值”一面重新粘在一起:

- set_fact:
    reassembled: |
      {% for grouper in (mydict | dict2items | groupby('value.attr1')) %}
      {% set a_key = grouper[0] %}
      {% set d = dict() %}
      {% for it in grouper[1] %}
      {%   set _ = d.update({it["key"]: it["value"]}) %}
      {% endfor %}
      the key = {{ a_key }} and d={{ d }}
      {% endfor %}

我将耐心等待techraf指出这样做的更简洁方法,但是由于没有其他人参与进来,所以我认为我会对此采取行动。

答案 1 :(得分:0)

事实证明groupby支持索引。代替values()使用items()

我通过这个实现了

{% for grouper in mydict.items()|groupby('1.attr1') %} 
   something 
{% endfor %}