Группировка элементов в словаре по последнему символу клавиш [iOS Swift 5] - PullRequest
4 голосов
/ 08 февраля 2020

У меня есть словарь, который я хочу сгруппировать по последнему символу клавиш. Это словарь:

var displayValues = ["volume_1": 1, "price_2": 6, "price_1": 2, "stock_1": 3, "volume_2": 5, "stock_2": 7]

Это код, который я использовал для их группировки

let groupValues = Dictionary(grouping: displayValues) { $0.key.last! }
print(groupValues)

Это результат этого кода

["2": [(key: "price_2", value: 6), (key: "volume_2", value: 5), (key: "stock_2", value: 7)], "1": [(key: "volume_1", value: 1), (key: "price_1", value: 2), (key: "stock_1", value: 3)]]

Группировка правильная, однако, как убрать слова key и value из словаря, чтобы он отображал следующее?

[
  "2": ["price_2": 6, "volume_2" : 5, "stock_2": 7], 
  "1": ["volume_1": 1, "price_1": 2, "stock_1": 3]
]

Ответы [ 2 ]

5 голосов
/ 08 февраля 2020

Вы почти у цели! *

Теперь у вас есть ключ, который вы хотите, и значение в виде массива кортежей

Вы можете конвертировать массив кортежей в словарь с новым reduce(into:)

полный код будет

    var displayValues = ["volume_1": 1, "price_2": 6, "price_1": 2, "stock_1": 3, "volume_2": 5, "stock_2": 7];
    let dict = Dictionary(grouping: displayValues) { $0.key.suffix(1)}
    let final = dict. mapValues { value  in
        return value.reduce(into: [:]) { $0[$1.key] = $1.value }
    }
    print(final)

Вывод:

["2": ["price_2": 6, "volume_2": 5, "stock_2": 7 ], "1": ["price_1": 2, "stock_1": 3, "volume_1": 1]]

2 голосов
/ 08 февраля 2020

В этом случае Dictionary(grouping:by:) создает Dictionary типа [Character : [(key: String, value: Int)]]. Таким образом, значения являются массивом (key: String, value: Int) кортежей.

Используйте .mapValues() для преобразования массива (key: String, value: Int) кортежей в Dictionary, вызвав Dictionary(uniqueKeysWithValues) с массивом:

var displayValues = ["volume_1": 1, "price_2": 6, "price_1": 2, "stock_1": 3, "volume_2": 5, "stock_2": 7]

let groupValues = Dictionary(grouping: displayValues) { String($0.key.suffix(1)) }
    .mapValues { Dictionary(uniqueKeysWithValues: $0) }

print(groupValues)

Результат:

["1": ["stock_1": 3, "price_1": 2, "volume_1": 1], "2": ["volume_2": 5, "stock_2": 7, "price_2": 6]]

Примечание:

Чтобы избежать принудительно разверните (что приведет к созданию sh, если у вас есть пустой String в качестве ключа), я использовал String($0.key.suffix(1)) вместо $0.key.last!. Это сделает окончательный словарь [String : [String : Int]], который можно удобно индексировать с помощью String.

. Спасибо @LeoDabus за это предложение.

...