local.tf
locals{
sample_map = [
{"aaa":"111"},
{"bbb":"222"},
{"aaa":"333"},
{"bbb":"444"},
]
}
我想将此示例映射的值合并为基于相同键的列表格式。 所以我想做的形式是这样的。
sample_map_result = {
"aaa": ["111","333"]
"bbb": ["222","444"]
}
提前感谢您的帮助。
我编写了这段代码,但我不知道下一步。
sample_map_result = flatten([
for mp in local.sample_map: flatten([
for k, v in mp: {
}
])
])
您的初始示例无效,因为实际上不可能使用此处所示的重复键构建映射。映射行为的基本组成部分是每个键只能存在一次。
最直接的答案是直接以您想要的形式写出地图,作为列表映射或集合映射:
sample_map_result = tomap({
aaa = toset(["111","333"])
bbb = toset(["222","444"])
})
如果将每个对作为单独的值是一个重要的要求,那么您需要决定其他方法来表示这些对。例如,您可以将源数据写入为一组元组:
locals {
sample_items = toset([
["aaa", "111"],
["bbb", "222"],
["aaa", "333"],
["bbb", "444"],
])
}
然后,您可以使用...
分组模式使用for
表达式将其投影到列表映射中:
locals {
result = tomap({
for pair in local.sample_items : pair[0] => pair[1]...
})
}
值表达式 (pair[1]
) 后面的...
符号告诉 Terraform 您打算按键表达式 (pair[0]
的结果对值进行分组。
此常规模式适用于每对键和值具有一个元素的任何源集合。您只需要在=>
符号之前和之后编写适当的表达式,即可告诉 Terraform 如何(分别)查找每个输入元素的键和值。
解决方案在哪里
from collections import defaultdict
sample_map_result = defaultdict(list)
for mp in local.sample_map:
for k, v in mp.items():
sample_map_result[k].append(v)
sample_map_result = dict(sample_map_result)