Назад | Перейти на главную страницу

преобразование двух списков в определенный словарь, чтобы его можно было отсортировать

Я хочу преобразовать следующие списки:

rtt: [38,1,97]
site: ["A","B","C"]

в словарь, например:

dict: [ {'rtt':38, 'site':'A'},{'rtt':1, 'site':'B'},{'rtt':97,'site':'C'}]

поэтому я могу отсортировать его по rtt, используя:

x = dict | sort(attribute:'rtt')

а затем извлеките атрибут сайта в правильном порядке:

x | map(attribute:'site') | list

должен дать: [ 'B', 'A', 'C']

Ладно, я понял:

- name: create dict list variable, NICE ONE
    set_fact:
     SITES_DICT: "{{ SITES_DICT|default([]) + [{'site': item.1,'rtt': item.0}] }}"
    with_together:
        - "{{ rtt }}"
        - "{{ site }}"

  - debug:
      msg: "{{ SITES_DICT }}"
      verbosity: 1

  - name: extract sites in sequence of rtt (!!)
    set_fact:
     sites_list: "{{ SITES_DICT | sort(attribute='rtt') | map(attribute='site') | list }}"

Вот пример использования zip для получения результатов. Это позволит вам делать все за одну задачу без промежуточных set_fact / registers, создающих переменные.

- hosts: localhost
  gather_facts: no
  vars:
    rtt: [38,1,97]
    site: ["A","B","C"]
  tasks:

  - debug:
      msg: |
        {{ site | zip(rtt) | sort(attribute='1') | 
           map(attribute='0') | list }}

# TASK [debug] ***************************
# ok: [localhost] => {
#     "msg": [
#         "B",
#         "A",
#         "C"
#     ]
# }

  - debug:
      msg: |
        {{ site | zip(rtt) | sort(attribute='1') }}

# TASK [debug] ***************************
# ok: [localhost] => {
#     "msg": [
#         [
#             "B",
#             1
#         ],
#         [
#             "A",
#             38
#         ],
#         [
#             "C",
#             97
#         ]
#     ]
# }