【问题标题】:How do I filter an array of dictionaries如何过滤字典数组
【发布时间】:2019-04-09 18:55:23
【问题描述】:

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

[“利摩日大学”:“法国”、“维陶塔斯马格努斯大学”:“立陶宛”、“塞尔希比联邦大学”:“巴西”、“里斯本理工学院”:“葡萄牙”、“圣卢西亚大学” Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"]

我们有一个对应国家/地区的大学列表,我想按国家/地区过滤此词典,例如“法国”,我应该得到一个新的词典数组(或如果可能的话,大学数组)。我对 Swift 很陌生。我已经四处寻找了一段时间,但找不到任何可以解决此问题的方法。

这是我的数组的外观和定义方式:

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] }

【问题讨论】:

    标签: swift dictionary filter


    【解决方案1】:

    你可以这样做:)。

    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"],我希望这是您根据问题寻找的内容。

    根据评论更新解决方案:

    我不确定 100% 的预期结果是什么,所以我创建了两个变体:

    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"))
    

    这将为您提供以下结果:

    ["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"]]
    

    【讨论】:

    • 问题是这只是我阵列的一小部分。我有多个以法国为国家的词典。所以我想过滤它并得到一个包含所有以法国为国家的字典的数组
    【解决方案2】:
    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 步骤往往会找到很多元素。不偷懒,有filter创建的临时字典,立马扔掉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多