【问题标题】:Get average of Integer values by comparing 2 different array based on their index通过根据索引比较 2 个不同的数组来获取整数值的平均值
【发布时间】:2022-07-08 00:36:04
【问题描述】:

我陷入了这个问题。

这是我的数组字典:

{"Image":["22301657205688/Chin2231657205705u3zK.jpeg","22301657205688/Chin2231657205707k6HN.jpeg","22301657205688/Chin2231657205708Ip57.jpeg","22301657205688/Forehead2231657205693CbX9.jpeg","22301657205688/L Cheek2231657205697g8d4.jpeg","22301657205688/Nose22316572057008AGT.jpeg","22301657205688/Nose2231657205702k9OU.jpeg"],"OutputScore":[3,9,9,3,1,3,9],"TotalScore":5.285714285714286}

我需要为 Chin and Nose 等常见图像名称获取 OutputScore 的平均数量,这些名称在 Image 数组中很常见。 如何过滤通用名称,然后将其与 OutputScore 索引进行比较并获得相同名称的平均值?

例如,索引 5,6 处有 2 个鼻子图像名称,我需要它们在同一索引处的 OutputScore 值 3,9 的平均得分。

请帮忙。谢谢。

【问题讨论】:

  • 你先解析你的 JSON 了吗?你有字典/数组吗?如果一直是SomeChar/[Part]someOtherId.jpeg,并且outputscore对应相同的索引,你可以使用提取名称,然后压缩,然后进行计算。但是您需要首先解析您的数据。 “下巴”、“鼻子”一开始就知道吗?
  • @Larme,我在 API 响应中获取了这本字典,我需要在另一个 API 中传递人脸类型的平均分数。

标签: ios arrays swift filter compare


【解决方案1】:

让我们从解析 JSON 开始,然后提取值:

let jsonStr = """
{
"Image": [
    "22301657205688/Chin2231657205705u3zK.jpeg",
    "22301657205688/Chin2231657205707k6HN.jpeg",
    "22301657205688/Chin2231657205708Ip57.jpeg",
    "22301657205688/Forehead2231657205693CbX9.jpeg",
    "22301657205688/L Cheek2231657205697g8d4.jpeg",
    "22301657205688/Nose22316572057008AGT.jpeg",
    "22301657205688/Nose2231657205702k9OU.jpeg"
],
"OutputScore": [
    3,
    9,
    9,
    3,
    1,
    3,
    9
],
"TotalScore": 5.285714285714286
}
"""

let jsonDict = try! JSONSerialization.jsonObject(with: Data(jsonStr.utf8), options: []) as! [String: Any]
let images = jsonDict["Image"] as! [String]
let scores = jsonDict["OutputScore"] as! [Int]

您需要一种从该部分 URL 中提取“名称”的方法。这是一个尝试这样做。您的全部需求还不够明确,但它可以为您的样本解决问题。

func extractPart(from: String) -> String? {
    let regex = try! NSRegularExpression(pattern: "\\d+\\/([A-Za-z ]+)", options: [])
    guard let firstMatch = regex.firstMatch(in: from, options: [], range: NSRange(location: 0, length: from.utf16.count)) else { return nil }
    let partNSRange = firstMatch.range(at: 1)
    guard let partRange = Range(partNSRange, in: from) else { return nil }
    let part = from[partRange]
    return String(part)
}

我们需要“链接”images[0] & scores[0], images[1] & scores[1], ... images[n] & scores[n]
为此,我们可以使用zip():

let zip = zip(images, scores)

现在,让我们重新组合具有相同部分名称的 zip 值:

我们可以使用Dictionary(grouping:by:) 来对值进行分组,将其转换为字典,其中键是零件名称,并为 zip 对赋值:

let partDict: [String : [(String, Int)]] = Dictionary(grouping: zip) { anCoupleElement in
    guard let name = extractPart(from: anCoupleElement.0) else {
        print("Couldn't extract part name from \(anCoupleElement.0)")
        return "Unknown Key"
    }
    return name
}
print(partDict)

我们可以使用reduce(into:_:) 来对值进行分组,将其转换为字典,其中键是部件名称,值是 zip 对

let reduced = zip.reduce(into: [String: [(String, Int)]]()) { partialResult, current in
    guard let name = extractPart(from: current.0) else {
        print("Couldn't extract part name from \(current.0)")
        return
    }
    partialResult[name, default: []] += [current]
}
print(reduced)

然后,我们可以计算平均值。 我选择了一个迭代,因为不清楚你是否有“下巴”,你需要在字典中搜索它。我使用了一个 for 循环来展示它们:

for (aPartName, values) in partDict { //or for (aPartName, values) in reduced
    let average = Float(values.reduce(0) { $0 + $1.1 }) / Float(values.count)
    print("For: \(aPartName), average: \(average)")
    print("With values:")
    values.forEach {
        print("\t\($0.0) - \($0.1)")
    }
}

最终输出:

For: Forehead, average: 3.0
With values:
    22301657205688/Forehead2231657205693CbX9.jpeg - 3
For: Nose, average: 6.0
With values:
    22301657205688/Nose22316572057008AGT.jpeg - 3
    22301657205688/Nose2231657205702k9OU.jpeg - 9
For: L Cheek, average: 1.0
With values:
    22301657205688/L Cheek2231657205697g8d4.jpeg - 1
For: Chin, average: 7.0
With values:
    22301657205688/Chin2231657205705u3zK.jpeg - 3
    22301657205688/Chin2231657205707k6HN.jpeg - 9
    22301657205688/Chin2231657205708Ip57.jpeg - 9

【讨论】:

    猜你喜欢
    • 2022-06-29
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 2019-12-06
    • 2018-06-30
    • 1970-01-01
    相关资源
    最近更新 更多