假设我有类似下面的词典,想要一系列红狗。我想我需要使用第一个字典获取“dog”类型的所有名称的数组,然后使用名称键和颜色来搜索最终字典以获得[“Polly”,“jake”]。我尝试使用循环,但无法弄清楚如何遍历字典。
var pets = ["Polly" : "dog", "Joey" : "goldfish", "Alex" : "goldfish", "jake" : "dog"]
var petcolor = ["Polly" : "red", "Joey" : "black", "Alex" : "yellow", "jake":red"]
答案 0 :(得分:1)
正确的解决方案似乎是创建一个Pet
结构(或类)并将所有这些信息整理到一个结构中,并构建一个充满这些值的数组或字典。
struct Pet {
let name: String
let type: String
let color: String
init(name: String, type: String, color: String) {
self.name = name
self.type = type
self.color = color
}
}
现在,让我们构建一系列宠物:
var goodPets = [Pet]()
for (petName, petType) in pets {
guard let petColor = petcolor[petName] else {
// Found this pet's type, but couldn't find its color. Can't add it.
continue
}
goodPets.append(Pet(name: petName, type: petType, color: petColor))
}
现在我们已经填写了goodPets
,删除任何特定的Pets子集变得非常:
let redDogs = goodPets.filter { $0.type == "dog" && $0.color = "red" }
虽然这个答案看起来像很多设置&腿部工作与其他答案相比,这里的主要优点是,一旦我们构建goodPets
数组, 任何 方式,我们希望将宠物从那里挖出来最终成为更高效。随着我们增加宠物的属性数量,与其他答案相比,这变得越来越真实。
如果您宁愿将模型对象存储在继续使用名称作为键的字典中,我们也可以这样做,但过滤器看起来有点奇怪。
构建字典看起来大多数相同:
var goodPets = [String : Pet]()
for (petName, petType) in pets {
guard let petColor = petcolor[petName] else {
// Found this pet's type, but couldn't find its color. Can't add it.
continue
}
goodPets[petName] = (Pet(name: petName, type: petType, color: petColor))
}
但过滤器略有不同:
let redDogs = goodPets.filter { $0.1.type = "dog" && $0.1.color = "red" }
请注意,在这两种情况下,redDogs
都有[Pet]
类型,即Pet
值数组。
答案 1 :(得分:0)
你可以迭代这样的字典:
for key in pets.keys() {
if pets[key] == "Dog" {
}
}
或者:
for (name, pet) in pets {
if pet == "Dog" {
}
}
答案 2 :(得分:0)
nhgrif对于结构可能是正确的,但要回答字面上的问题:
let dogs = Set(pets.filter { $0.1 == "dog" }.map { $0.0 })
let redAnimals = Set(petscolor.filter { $0.1 == "red" }.map { $0.0 })
let redDogs = dogs.intersect(redAnimals)
每个filter
是一个对(key,value)元组进行操作的块,测试该值并最终创建仅包含匹配(键,值)对的字典。然后,每个map
通过丢弃值并保留密钥,将过滤后的字典转换为数组。
每个数组都变成一个集合以支持intersect
操作。然后intersect
确定两个结果的交集。