Terraform中如何将两个等长列表转换为字典并去除重复项
核心注意点
- 不要单独对键列表、值列表分别调用
toset()做去重:Terraform的集合(set)是无序数据结构,转换后会彻底丢失两个列表原有的下标对应关系,完全无法保证键值配对正确。举个反例,转集合后keys可能排序为["Kil", "Rash", "Varsha"]、values可能排序为[1,5,4],最终会得到{"Kil":1, "Rash":5, "Varsha":4}这种完全错位的错误结果。 - 正确的去重+转字典逻辑不需要提前转集合,Terraform构造map时遇到重复键会自动保留最后一次出现的对应值,刚好匹配去重需求。
实现代码
两种写法效果完全一致,都能得到正确结果:
- 下标遍历写法(逻辑更直观):
locals { test_keys = ["Rash", "Kil", "Varsha", "Varsha"] test_values = [1, 4, 5, 5] target_map = { for idx, key in local.test_keys : key => local.test_values[idx] } }
- 内置函数写法(更简洁):
locals { test_keys = ["Rash", "Kil", "Varsha", "Varsha"] test_values = [1, 4, 5, 5] target_map = zipmap(local.test_keys, local.test_values) }
结果验证
在Terraform工作目录执行terraform console,输入local.target_map即可得到符合预期的结果:
> local.target_map { "Kil" = 4 "Rash" = 1 "Varsha" = 5 }
注:Terraform的Map类型输出时会自动按键名字典序排序,和输入时的键顺序无关,但所有键值的匹配关系完全和原列表的下标对应关系一致,不会出现配对错误。如果同一个键在列表中多次出现且对应值不同,最终结果会保留该键最后一次出现时对应的value。
内容的提问来源于stack exchange,提问作者aquaticdigest
相关产品推荐
相关产品推荐

