反转Swift字典中值的键,收集重复值
我有以下字典:反转Swift字典中值的键,收集重复值,swift,dictionary,Swift,Dictionary,我有以下字典: let dict = ["key1": "v1", "key2": "v1", "key3": "v2"] 我想交换键的值,以便结果为: result = ["v1": ["key1", "key2"], "v2": ["key3"]] 如何在不使用循环的情况下(即以功能方式)执行此操作?您可以在Swift 4中使用分组初始值设定项: let dict = ["key1": "v1", "key2": "v1", "key3": "v2"] let result = Dict
let dict = ["key1": "v1", "key2": "v1", "key3": "v2"]
我想交换键的值,以便结果为:
result = ["v1": ["key1", "key2"], "v2": ["key3"]]
如何在不使用
循环的情况下(即以功能方式)执行此操作?您可以在Swift 4中使用分组初始值设定项:
let dict = ["key1": "v1", "key2": "v1", "key3": "v2"]
let result = Dictionary(grouping: dict.keys.sorted(), by: { dict[$0]! })
注二:
如果结果数组中键的顺序不重要,则可以删除.sorted()
在这种情况下,强制展开是安全的,因为我们将现有字典键作为$0
参数
在Swift 4中,字典
中有一个初始值设定项,在这里应该很有用
let d = [1 : "one", 2 : "two", 3 : "three", 30: "three"]
let e = Dictionary(d.map({ ($1, [$0]) }), uniquingKeysWith: {
(old, new) in old + new
})
如果原始dict中没有需要组合的重复值,则这将更简单(使用):
这是一个特殊应用程序,它提供了按键对键值对进行分组的常用功能
公共扩展字典{
///按键对键值对进行分组。
///
///-参数对:Swift.KeyValuePairs`
///或与该元素类型相同的“序列”。
///-返回:`[KeyValuePairs.Key:[KeyValuePairs.Value]]`
初始化(分组对:KeyValuePairs)
哪里
元素==(键:键,值:值),
Self.Value==[值]
{
自我=
字典(分组:对,按:\.键)
.mapValues{$0.map(\.value)}
}
///按键对键值对进行分组。
///
///-参数对:如'Swift.KeyValuePairs',
///但是使用未标记的元素。
///-返回:`[KeyValuePairs.Key:[KeyValuePairs.Value]]`
初始化(分组对:KeyValuePairs)
哪里
KeyValuePairs.Element==(键,值),
Self.Value==[值]
{
init(分组:pairs.map{(键:$0,值:$1)})
}
}
这样,只需翻转每个键值对,就可以进城了
Dictionary(分组:dict.map{($0.value,$0.key)})
使用进行循环。即使你不循环,显然有人必须循环,那么这有什么区别呢?“更优雅”是一个模糊的概念,不适合堆叠溢出问题。@matt,在这个问题上不必太迂腐。您知道有些人喜欢他们的代码更干净,他们称之为“优雅”。我不认为你没有理解我想说的。实际上,排序在这里基本上是不可操作的,因为字典是未排序的。@Cristik它是正在排序的字典键的集合,而不是字典本身。
let d = [1 : "one", 2 : "two", 3 : "three"]
let e = Dictionary(uniqueKeysWithValues: d.map({ ($1, $0) }))