【问题标题】:Multiply one dictionary by another in Swift在 Swift 中将一个字典乘以另一个字典
【发布时间】:2020-11-30 22:10:14
【问题描述】:

目前,我有一个嵌套字典声明为:

let VitamineARetinol = "VitamineARetinol"
let VitamineABetacarotene = "VitamineABetacarotene"
let VitamineC = "VitamineC"
let VitamineD = "VitamineD"
let Calories = "Calories"

typealias ListOfAliment = [String: [String: Double]]

let Data: ListOfAliment = [
    "Orange": [VitamineARetinol: 0.5, VitamineC: 0.3, VitamineD: 0.98, Calories: 160],
    "Pomme": [VitamineARetinol: 0.2, VitamineC: 0.2, VitamineD: 0.38, Calories: 120],
    "Poire": [VitamineARetinol: 0.1, VitamineC: 0.7, VitamineD: 0.58, Calories: 140],
    "Laitue": [VitamineARetinol: 0.3, VitamineC: 0.1, VitamineD: 0.92, Calories: 105],
    "Banane": [VitamineARetinol: 0.7, VitamineC: 0.01, VitamineD: 0.63, Calories: 122],
]

而且我需要将每个值与其在以下字典中的对应值相除:

let reference: ListOfAliment = [
    "reference": [VitamineARetinol: 0.2, VitamineC: 0.1, VitamineD: 0.4],
]

最后,我应该得到一个食物字典,其中每种食物的所有值都除以字典参考中的对应值 拜托,谁能帮帮我!

【问题讨论】:

  • 有什么理由不使用自己的结构?
  • 你能告诉我如何创造一个好的吗?

标签: swift dictionary nested


【解决方案1】:

鉴于我在您的 previous question 中的回答,您可以简单地将您的值数组映射到一个新数组中

let adjustedData = array
    .map { Aliment(name: $0.name, 
                   vitamineARetinol: $0.vitamineARetinol / 0.2, 
                   vitaminC: $0.vitaminC / 0.1, 
                   vitaminD: $0.vitaminD / 0.4, 
                   calories: $0.calories)}

【讨论】:

    【解决方案2】:

    您绝对应该为内部字典创建一个结构。因为那时您可以在结构中添加一个dividedBy 方法来进行除法。我不确定将一种食物“划分”为另一种食物是否有意义。如果是这样,您可以更改divideBy 方法以接受另一个Aliment

    struct Aliment {
        let vitaminARetinol: Double
        let vitaminC: Double
        let vitaminD: Double
        let calories: Double
        
        func dividedBy(vitaminARetinolFactor: Double, vitaminCFactor: Double, vitaminDFactor: Double, caloriesFactor: Double) -> Aliment {
            Aliment(vitaminARetinol: vitaminARetinol / vitaminARetinolFactor,
                    vitaminC: vitaminC / vitaminCFactor,
                    vitaminD: vitaminD / vitaminDFactor,
                    calories: calories / caloriesFactor)
        }
    }
    typealias ListOfAliment = [String: Aliment]
    let data: ListOfAliment = [
        "Orange": Aliment(vitaminARetinol: 0.5, vitaminC: 0.3, vitaminD: 0.98, calories: 160),
        "Pomme": Aliment(vitaminARetinol: 0.2, vitaminC: 0.2, vitaminD: 0.38, calories: 120),
        "Poire": Aliment(vitaminARetinol: 0.1, vitaminC: 0.7, vitaminD: 0.58, calories: 140),
        "Laitue": Aliment(vitaminARetinol: 0.3, vitaminC: 0.1, vitaminD: 0.92, calories: 105),
        "Banane": Aliment(vitaminARetinol: 0.7, vitaminC: 0.01, vitaminD: 0.63, calories: 122),
    ]
    

    要转换字典,可以使用mapValues

    let referenceNumbers = reference["reference"]!
    let newData = data.mapValues { 
        $0.dividedBy(vitaminARetinolFactor: referenceNumbers[VitamineARetinol]!, 
                     vitaminCFactor: referenceNumbers[VitamineC]!, 
                     vitaminDFactor: referenceNumbers[VitamineD]!, 
                     caloriesFactor: referenceNumbers[Calories]!) 
    }
    

    同样,如果将一种食物除以另一种食物有意义,您也可以将引用设为Aliment 对象,并将其传递给divideBy

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-27
      • 1970-01-01
      • 2019-05-08
      相关资源
      最近更新 更多