首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将一个字典拆分成另一个字典

问如何将一个字典拆分成另一个字典
EN

Stack Overflow用户
提问于 2018-01-12 18:16:27
回答 3查看 1.2K关注 0票数 2

考虑到这本字典:

代码语言:javascript
复制
var dict = ["Steve": 17,
             "Marc": 38,
             "Xavier": 21,
             "Rolf": 45,
             "Peter": 67,
             "Nassim" : 87,
             "Raj": 266,
             "Paul": 220,
             "Bill": 392]

我需要创建一个Category对象的3个新实例:

代码语言:javascript
复制
class Category {
    var name = ""
    var note = 0
}

并使用var dict创建此对象的3个新实例(即:初级、中级、高级)。

假设我已经知道前3个是初级的,接下来的3个是中级的,最后3个是高级的。

谢谢,

EN

回答 3

Stack Overflow用户

发布于 2018-01-12 18:34:25

一般来说,Dictionary是没有排序的,所以你不能像在Array上那样遍历它。但是你可以这样做:

代码语言:javascript
复制
    let array = [("Steve", 17),
                 ("Marc", 38),
                 ("Xavier", 21),
                 ("Rolf", 45),
                 ("Peter", 67),
                 ("Nassim", 87),
                 ("Raj", 266),
                 ("Paul", 220),
                 ("Bill", 392)]
    var dicts = [[String: Int]]()

    for _ in 0..<3 {
        dicts.append([String: Int]())
    }

    for i in 0..<array.count {
        dicts[i % 3][array[i].0] = array[i].1
    }
票数 0
EN

Stack Overflow用户

发布于 2018-01-12 19:19:31

如果您不打算更改输入数据(家庭作业?)这可能是你想要的:

代码语言:javascript
复制
import Foundation

var data = ["Steve": 17,
             "Marc": 38,
             "Xavier": 21,
             "Rolf": 45,
             "Peter": 67,
             "Nassim" : 87,
             "Raj": 266,
             "Paul": 220,
             "Bill": 392]


enum Seniority { case senior, junior, intermediate }

struct Worker {
    let name: String
    let note: Int
}

struct Category {
    let seniority: Seniority
    let staff: [Worker]
}

/* the partition is fixed, but at least sort by score to get it */
let all = data.sorted { (a, b) -> Bool in
    return a.value < b.value
}

/* let's use some weird variable names to note the absurd of a hardcoded partition */
let _1_3 = all.prefix(3)
let _4_6 = all.suffix(from: 3).prefix(3)
let _7_9 = all.suffix(3)

let junior = Category(seniority: .junior, staff: _1_3.map { Worker(name: $0.key, note: $0.value) })
let intermediate = Category(seniority: .intermediate, staff: _4_6.map { Worker(name: $0.key, note: $0.value) })
let senior = Category(seniority: .senior, staff: _7_9.map { Worker(name: $0.key, note: $0.value) })

让我们检查一下结果类别:

代码语言:javascript
复制
print(junior.staff.map { "\($0.name) -> \($0.note)" })
// ["Steve -> 17", "Xavier -> 21", "Marc -> 38"]
print(intermediate.staff.map { "\($0.name) -> \($0.note)" })
// ["Rolf -> 45", "Peter -> 67", "Nassim -> 87"]
print(senior.staff.map { "\($0.name) -> \($0.note)" })
// ["Paul -> 220", "Raj -> 266", "Bill -> 392"]

原始答案:

如果dict (我将其重命名为staff)中的数字是某种分数:

代码语言:javascript
复制
import Foundation

var staff = ["Steve": 17,
            "Marc": 38,
            "Xavier": 21,
            "Rolf": 45,
            "Peter": 67,
            "Nassim" : 87,
            "Raj": 266,
            "Paul": 220,
            "Bill": 392]

让我们在它们上定义一个分区:

代码语言:javascript
复制
let categories: [String:Any] = [
    "junior" : (0...19),
    "intermediate": (20..<100),
    "senior": (100...)
]

外加一个函数,根据该分区返回给定分数的资历名称:

代码语言:javascript
复制
func seniority(score: Int) -> String {
    for category in categories {
        if let range = category.value as? CountableRange<Int> {
            if range.contains(score) {
                return category.key
            }
        }
        else if let range = category.value as? CountableClosedRange<Int> {
            if range.contains(score) {
                return category.key
            }
        }
        else if let range = category.value as? CountablePartialRangeFrom<Int> {
            if range.contains(score) {
                return category.key
            }
        }
    }
    fatalError("Defined ranges should cover all possible scores")
}

assert(seniority(score: staff["Steve"]!) == "junior")
assert(seniority(score: staff["Xavier"]!) == "intermediate")
assert(seniority(score: staff["Paul"]!) == "senior")

最后,使用分区和定义的函数将原始staff字典拆分为"n“个新字典:

代码语言:javascript
复制
var newStaff = Dictionary(uniqueKeysWithValues: zip(categories.keys, 
                          repeatElement([String:Int](), count: categories.count)))
for (name, score) in staff {
    let category = seniority(score: score)
    newStaff[category]![name] = score
}

print(newStaff)

我得到了:

代码语言:javascript
复制
["intermediate": ["Nassim": 87, "Marc": 38, "Peter": 67, "Rolf": 45, "Xavier": 21], 
 "senior": ["Bill": 392, "Paul": 220, "Raj": 266], 
 "junior": ["Steve": 17]
]

您可以很容易地根据您的实际需求对其进行调整。

票数 0
EN

Stack Overflow用户

发布于 2018-01-12 19:29:59

我可能会这样定义一个Worker类:

代码语言:javascript
复制
enum Seniority {
    case junior, intermediate, senior
}

struct Worker {
    var name: String
    var score: Int
    var seniority: Seniority
}

然后,您可以将字典映射到workers数组(请注意,您必须使用名称,并且不能使用顺序,因为在Swift中为dictionaries have no order ):

代码语言:javascript
复制
var workers = [Worker]()
for name in dict.keys {
    switch name {
    case "Steve", "Marc", "Xavier": workers += [Worker(name: name, score: dict[name]!, seniority: .junior)]
    case "Rolf", "Peter", "Nassim": workers += [Worker(name: name, score: dict[name]!, seniority: .intermediate)]
    default: workers += [Worker(name: name, score: dict[name]!, seniority: .senior)]
    }
}

例如,使用它可以检索一个仅包含高级工作者的数组,如下所示:

代码语言:javascript
复制
let seniors = workers.filter { $0.seniority == .senior }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48224048

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档