首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何过滤字典数组?

如何过滤字典数组?
EN

Stack Overflow用户
提问于 2019-04-10 02:55:24
回答 2查看 57关注 0票数 0

我有一个名为uniLib的库数组。这是我打印它时的样子(这只是一小部分):

“利摩日大学”:“法国”,“维陶塔斯大学”:“立陶宛”,“塞尔吉普联邦大学”:“巴西”,“里斯本政治学院”:“葡萄牙”,“圣布埃纳文图拉大学”:“哥伦比亚”,“威迪亚塔马大学”:“印度尼西亚”,“郑州工业大学”:“中国”

我们有一个具有相应国家的大学列表,我想按国家过滤这个字典,例如“法国”,我应该得到一个新的字典数组(如果可能的话,或者是大学的数组)。我是Swift的新手。我已经找了一段时间了,但是我找不到任何东西来解决这个问题。

下面是我的数组的外观和定义:

代码语言:javascript
复制
universityNames =  json[].arrayValue.map {$0["name"].stringValue}
countryNames =  json[].arrayValue.map {$0["country"].stringValue}

// merge arrays
var uniLib : [String:String] = [:]
for (index, element) in universityNames.enumerated() {
uniLib[element] = countryNames[index] }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-10 03:15:40

您可以这样做:)。

代码语言:javascript
复制
let universities = ["Université de Limoges": "France", "Vytautas Magnus University": "Lithuania", "Universidade Federal de Sergipe": "Brazil", "Instituto Politécnico de Lisboa": "Portugal", "Universidad de San Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"]

func filterUniversities(country: String) -> [String] {
    return universities
        .compactMap { tuple in
            return tuple.value == country ? tuple.key : nil
        }
}

print(filterUniversities(country: "France"))

这将返回["Université de Limoges"],我希望这是您根据问题所要查找的内容。

基于评论的更新解决方案:

我不能百分之百确定预期的结果是什么,所以我创建了两个变体:

代码语言:javascript
复制
let allUniversities = [
    ["Université de Limoges": "France", "Universidad de San Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"],
    ["Universidade Federal de Sergipe": "Brazil", "Vytautas Magnus University": "Lithuania"],
    ["Instituto Politécnico de Lisboa": "Portugal", "Sorbonne": "France"]
]

func filterUniversities(country: String) -> [String] {
    return allUniversities
        .lazy
        .reduce([String]()) { (result, universities) in
            let filteredUniversities = universities.compactMap { $0.value == country ? $0.key : nil }

            return result + filteredUniversities
        }
}

print(filterUniversities(country: "France"))

func filterUniversityDictionaries(country: String) -> [[String: String]] {
    return allUniversities.lazy.filter { $0.values.contains(country) }
}

print(filterUniversityDictionaries(country: "France"))

这将为您提供以下结果:

代码语言:javascript
复制
["Université de Limoges", "Sorbonne"]

[["Zhengzhou University of Technology": "China", "Universidad de San Buenaventura": "Colombia", "Université de Limoges": "France", "Universitas Widyatama": "Indonesia"], ["Instituto Politécnico de Lisboa": "Portugal", "Sorbonne": "France"]]
票数 1
EN

Stack Overflow用户

发布于 2019-04-10 03:26:05

代码语言:javascript
复制
uniLib.lazy                         // Lazy so we don't have to allocate a temporary
    .filter { $0.value == country } // Find key/value pairs where value == country
    .map { $0.key }                 // Return the key (name)

在这里使用lazy的唯一原因是如果uniLib非常大,而filter步骤往往会找到很多元素。在没有lazy的情况下,filter会创建一个临时字典并立即将其丢弃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55599506

复制
相关文章

相似问题

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