別のリストに基づいて、リストからアイテムを削除したいのですが。
"my_list_one": [
"item1",
"item2",
"item3"
] }
私の2番目のリスト:
"my_list_two": [
"item3"
] }
このリストから「item3」を削除して、新しいファクトを設定するにはどうすればよいですか?
「-」とこれを使用してみました:
set_fact: "{{ my_list_one | union(my_list_two) }}"
最終目標:
"my_list_one": [
"item1",
"item2"
] }
difference
を使用するunion
ではない:
{{ my_list_one | difference(my_list_two) }}
プレイブックの例(set_fact
にも変数名を指定する必要があることに注意してください):
---
- hosts: localhost
connection: local
vars:
my_list_one:
- item1
- item2
- item3
my_list_two:
- item3
tasks:
- set_fact:
my_list_one: "{{ my_list_one | difference(my_list_two) }}"
- debug: var=my_list_one
結果(抜粋):
TASK [debug] *******************************************************************
ok: [localhost] => {
"my_list_one": [
"item1",
"item2"
]
}
2つのリストの違い(2に存在しない1のアイテム)を取得するには:
_{{ list1 | difference(list2) }}
_
注:順序は重要なので、{{ my_list_one | difference(my_list_two) }}
が必要です
これは単なるJinja2テンプレートであるため、純粋なPythonでは_list - list
_は定義されていません。
_In [1]: list1 = [1, 2, 3]
In [2]: list2 = [3]
In [3]: list1 - list2
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-a683b4e3266d> in <module>()
----> 1 list1 - list2
TypeError: unsupported operand type(s) for -: 'list' and 'list'
_
代わりに、リスト内包を行うことができます
_In [5]: [i for i in list1 if i not in list2]
Out[5]: [1, 2]
_