Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
反转Swift字典中值的键,收集重复值_Swift_Dictionary - Fatal编程技术网

反转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) }))