按键的最后一个字符对字典中的元素进行分组 [iOS Swift 5]
Grouping Elements in Dictionary by The Last Character of The Keys [iOS Swift 5]
我有一本字典,我想按键的最后一个字符分组。这是字典:
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) { [=13=].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]
]
你快到了!!
现在你有了你想要的键和元组数组的值
您可以使用新的 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) { [=10=].key.suffix(1)}
let final = dict. mapValues { value in
return value.reduce(into: [:]) { [=10=][.key] = .value }
}
print(final)
输出:
["2": ["price_2": 6, "volume_2": 5, "stock_2": 7], "1": ["price_1": 2, "stock_1": 3, "volume_1": 1]]
在这种情况下,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([=10=].key.suffix(1)) }
.mapValues { Dictionary(uniqueKeysWithValues: [=10=]) }
print(groupValues)
结果:
["1": ["stock_1": 3, "price_1": 2, "volume_1": 1], "2": ["volume_2": 5, "stock_2": 7, "price_2": 6]]
注:
为了避免 force unwrap(如果你有一个空的 String
作为键会崩溃),我使用 String([=21=].key.suffix(1))
而不是 [= 22=].key.last!
。这将使最终字典 [String : [String : Int]]
可以方便地用 String
.
索引
感谢@LeoDabus 的建议。
我有一本字典,我想按键的最后一个字符分组。这是字典:
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) { [=13=].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]
]
你快到了!!
现在你有了你想要的键和元组数组的值
您可以使用新的 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) { [=10=].key.suffix(1)}
let final = dict. mapValues { value in
return value.reduce(into: [:]) { [=10=][.key] = .value }
}
print(final)
输出:
["2": ["price_2": 6, "volume_2": 5, "stock_2": 7], "1": ["price_1": 2, "stock_1": 3, "volume_1": 1]]
在这种情况下,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([=10=].key.suffix(1)) }
.mapValues { Dictionary(uniqueKeysWithValues: [=10=]) }
print(groupValues)
结果:
["1": ["stock_1": 3, "price_1": 2, "volume_1": 1], "2": ["volume_2": 5, "stock_2": 7, "price_2": 6]]
注:
为了避免 force unwrap(如果你有一个空的 String
作为键会崩溃),我使用 String([=21=].key.suffix(1))
而不是 [= 22=].key.last!
。这将使最终字典 [String : [String : Int]]
可以方便地用 String
.
感谢@LeoDabus 的建议。