在 Swift 中将两个数组合并为一个字典
Posted
技术标签:
【中文标题】在 Swift 中将两个数组合并为一个字典【英文标题】:Combine two arrays to one dictionary in Swift 【发布时间】:2021-05-12 13:55:59 【问题描述】:我有两个数组:
let data = ["12 Mai 2021", "12 Mai 2021"]
let prices = [45.0, 50.0]
现在我想将这两个转换为一个字典,如下所示:
["12 Mai 2021":45.0, "12 Mai 2021":50.0]
如果输出可以是:
[("12 Mai 2021",45.0),("12 Mai 2021",50.0)]
但我不知道这是否可能...... 在这个板上,我已经偶然发现了“zip”解决方案,如下所示:
var dictionary = [String: Double]()
zip(data, prices).forEach dictionary[$0] = $1
print(dictionary)
但这只是打印出来的:
["12 Mai 2021": 50.0]
有人知道可行的解决方案吗?提前谢谢!
【问题讨论】:
12 Mai 2021
是同一日期。第二个将覆盖第一个。
在字典中,键是唯一的,这就是你有“问题”的原因。 ["12 Mai 2021":45.0, "12 Mai 2021":50.0]
不存在。
zip(data, prices).map( ($0.0, $0.1) )
?
Larne 非常感谢您解决了这两个问题!
@Larme map
后面的 zip
是不需要的。 zip
已经返回了 map
正在创建的相同元组!
【参考方案1】:
你说你想要这个Dictionary
:
["12 Mai 2021":45.0, "12 Mai 2021":50.0]
但那是不可能的。 Dictionary
中的每个键都必须是唯一的。密钥"12 Mai 2021"
不能使用两次。
然后你说你更喜欢这个“输出”:
[("12 Mai 2021",45.0),("12 Mai 2021",50.0)]
这是一组对(2 元组),您可以使用 zip
得到答案:
let pairs = zip(data, prices).map $0
// Type of pairs is [(String, Double)].
如果您真的想要Dictionary
,那么您必须决定如何处理重复键。也许您希望每个日期键映射到该日期价格的 array。这是一种方法:
let d = Dictionary(zip(data, prices.map [$0] )) $0 + $1
// Result: ["12 Mai 2021": [45.0, 50.0]]
上面的代码就是这样做的。
prices.map [$0]
将prices
从[Double]
转换为[[Double]]
,即转换为Double
的数组数组,其中每个内部数组仅包含一个价格:[[45.0], [50.0]]
。
zip
将日期和单价数组组合成对:[("12 Mai 2021", [45.0]), ("12 Mai 2021", [50.0])]
。
Dictionary
初始化程序将数组对转换为 [String: [Double]]
。当它找到重复键时,它使用闭包 $0 + $1
组合相应的值。这里,$0
和 $1
都是 [Double]
,所以闭包连接了数组。
【讨论】:
字典初始化程序中缺少右括号。另一种选择是将+
运算符作为uniquingKeysWith 参数Dictionary(zip(data, prices.map [$0] ), uniquingKeysWith: +)
我添加了缺少的关闭括号。这就是您不复制和粘贴代码时会发生的情况。以上是关于在 Swift 中将两个数组合并为一个字典的主要内容,如果未能解决你的问题,请参考以下文章