如何用Terraform获取单个列表的指定数量元素的所有组合?
在Terraform中生成单个列表的任意元素组合(顺序无关)
完全可以实现这个需求。Terraform本身没有专门的组合生成函数,但可以通过内置的for循环结合索引判断,或者递归函数来生成任意长度的元素组合(顺序无关,即不重复生成元素顺序不同的同一组合)。
方法一:针对固定长度组合(以2元素为例)
如果只需要固定长度的组合,比如2元素,可以通过嵌套for循环+索引判断来避免重复:
locals { fruits = tolist(["Apple", "Banana", "Orange"]) # 生成所有2元素组合 two_element_combinations = [ for i, fruit_a in local.fruits : [fruit_a, fruit_b] for j, fruit_b in local.fruits : if i < j # 只保留索引i小于j的组合,避免重复 ] } output "two_element_combinations" { value = local.two_element_combinations }
执行后输出与你预期一致:
[ [ "Apple", "Banana" ], [ "Apple", "Orange" ], [ "Banana", "Orange" ] ]
方法二:通用递归函数(支持任意长度组合)
如果需要灵活生成1个、3个甚至更多元素的组合,可以用递归函数实现通用的组合生成逻辑:
locals { fruits = tolist(["Apple", "Banana", "Orange"]) # 递归生成k元素组合的函数 generate_combinations = func(input_list, k) { list_length = length(input_list) # 递归终止条件 if k == 0 { return [[]] } if k > list_length { return [] } if k == list_length { return [input_list] } # 包含第一个元素的组合:第一个元素 + 剩余列表的k-1元素组合 with_first = [ for combo in local.generate_combinations(input_list[1:], k-1) : concat([input_list[0]], combo) ] # 不包含第一个元素的组合:剩余列表的k元素组合 without_first = local.generate_combinations(input_list[1:], k) return concat(with_first, without_first) } # 生成不同长度的组合 one_element_combinations = local.generate_combinations(local.fruits, 1) two_element_combinations = local.generate_combinations(local.fruits, 2) three_element_combinations = local.generate_combinations(local.fruits, 3) } output "one_element_combinations" { value = local.one_element_combinations } output "two_element_combinations" { value = local.two_element_combinations } output "three_element_combinations" { value = local.three_element_combinations }
执行后会得到:
- 1元素组合:
[["Apple"], ["Banana"], ["Orange"]] - 2元素组合:与方法一的输出一致
- 3元素组合:
[["Apple", "Banana", "Orange"]]
内容的提问来源于stack exchange,提问作者john4ster
相关产品推荐
相关产品推荐

