Как разделить словарь на группы на основе похожих ключей, а затем создать массив этих групп с обновленными ключами? - PullRequest
0 голосов
/ 24 января 2019

У меня есть словарь с ключами, к которым добавляются _0, _1, _2.

let dict = ["a_0":"0", "b_1":"1", "c_0":"2", "d_2":"3"]

Я хочу взять каждый ключ с одинаковым подчеркиванием и любым другим номером и поместить их в группу отдельно от других ключей. Любой ключ с _0 должен находиться в одной группе, _1 в другой группе, _2 в другой группе ...

let arrOfGroupedDictsWithSimilarKeys = [["a_0":"0", "c_0":"2"], ["b_1":"1", ], ["d_2":"3"] ]

И затем я хочу обновить ключи в каждой группе, удалив подчеркивание и номер из всех клавиш, но все еще сохраняю все в своих группах.

Результат должен быть

let arrOfGroupedDictsWithKeysChanged = [["a":"0", "c":"2"], ["b":"1"], ["d":"3"] ]

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Просто еще один похожий способ:

let dict = ["a_0":"0", "b_1":"1", "c_0":"2", "d_2":"3"]

 let result = Dictionary(grouping: dict)
              {(key, value) ->  String in return key.components(separatedBy: "_").last!}.values
              .map{Dictionary(uniqueKeysWithValues:$0.map{($0.key.components(separatedBy: "_").first!, $0.value)})}

print (result)

  // [["c": "2", "a": "0"], ["d": "3"], ["b": "1"]]
0 голосов
/ 24 января 2019
func transformDict(dict: [String: String]) -> [[String: String]] {
    var temp: [String: [String: String]] = [:]
    for (key, value) in dict {
        let components = key.components(separatedBy: "_")
        if components.count == 2 {
            let groupKey = components[1]
            let dictKey = components[0]
            if temp[groupKey] != nil {
                temp[groupKey]?[dictKey] = value
            } else {
                temp[groupKey] = [dictKey: value]
            }
        }
    }

    let res = Array(temp.values)
    return res
}

let res = transformDict(dict: ["a_0":"0",
                               "b_1":"1",
                               "c_0":"2",
                               "d_2":"3"])
print(res)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...