【问题标题】:Filter Array of Dictionary Objects by key and last value of that specified key按指定键的键和最后一个值过滤字典对象数组
【发布时间】:2021-07-30 10:07:56
【问题描述】:

假设以下数据:

var randomData = [[0: 0.0], [0: 0.005399568], [0: 0.031317495], [0: 0.059395213], [0: 0.08531314], [0: 0.111231074], [0: 0.13066952], [0: 0.15010796], [0: 0.16954641], [0: 0.18898486], [0: 0.21058308], [0: 0.23002152], [0: 0.25593945], [0: 0.2753779], [0: 0.28833687], [0: 0.29697624], [0: 0.30129582], [0: 0.3056155], [0: 0.3056155], [0: 0.30777532], [0: 0.30777532], [0: 0.30993518], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [0: 0.3142548], [2: 0.0010798806], [2: 0.072354175], [2: 0.072354175], [2: 0.12203024], [2: 0.1717062], [2: 0.21922246], [2: 0.26889843], [2: 0.30993518], [2: 0.3423326], [2: 0.36393085], [2: 0.3790496], [2: 0.39200857], [2: 0.40280774], [2: 0.41144702], [2: 0.42224622], [2: 0.4265659], [2: 0.4330454], [2: 0.43736497], [2: 0.44168466], [2: 0.44384444], [2: 0.44600433], [2: 0.4524838], [2: 0.46544278], [2: 0.47840175], [2: 0.4892008], [2: 0.4978402], [2: 0.50431967], [2: 0.50647944], [2: 0.50647944], [2: 0.50647944], [2: 0.50647944], [2: 0.50647944], [2: 0.51079917], [2: 0.5172786], [2: 0.5215982], [2: 0.5237581], [2: 0.5237581], [2: 0.5237581], [2: 0.5237581], [2: 0.5237581], [4: 0.0], [4: 0.07451397], [4: 0.07451397], [4: 0.10691138], [4: 0.1393088], [4: 0.1738661], [4: 0.20842329], [4: 0.24298048], [4: 0.28401726], [4: 0.32073426], [4: 0.35529158], [4: 0.3790496], [4: 0.39848804], [4: 0.41144702], [4: 0.42224622], [4: 0.4287257], [4: 0.4330454], [4: 0.43736497], [4: 0.44600433], [4: 0.4524838], [4: 0.46760258], [4: 0.48056152], [4: 0.4978402], [4: 0.51295894], [4: 0.5237581], [4: 0.5280777], [4: 0.53455716], [4: 0.54319656], [4: 0.54967606], [4: 0.5539956], [4: 0.55831534], [4: 0.562635], [4: 0.57343405], [4: 0.57991356], [4: 0.58639306], [4: 0.5907127], [4: 0.5907127], [4: 0.5907127], [4: 0.5928725], [4: 0.5928725], [4: 0.5928725], [5: 0.003239675], [5: 0.09179262], [5: 0.09179262], [5: 0.1393088], [5: 0.1738661], [5: 0.19330454], [5: 0.20842329], [5: 0.21706256], [5: 0.22570194], [5: 0.2343412], [5: 0.24298048], [5: 0.25161988], [5: 0.26241893], [5: 0.2775378], [5: 0.29265654], [5: 0.3034557], [5: 0.3142548], [5: 0.31857446], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426], [5: 0.32073426]]

我将如何将 randomData 过滤到一个变量 [[Int: Float]] 中,该变量返回每个键的最后一个对象。换句话说,预期的结果是:

[[0: 0.3142548], [2: 0.5237581], [4: 0.5928725], [5: 0.32073426]]

我认为逻辑是为每个键创建数组,然后获取最后一个元素,并将其重新用于数组,但这只是拉最后一个元素而不是最后一个元素每个键

let filtered = randomData.filter({$0.keys == $0.keys}).last
// Optional([5: 0.32073426])

let filtered = randomData.map({$0.filter({$0.key == $0.key})}).last
//Optional([5: 0.32073426])

一如既往地感谢任何建议和指导。

【问题讨论】:

  • 单元素字典不是 Swifty 的解决方案。试试KeyValuePairs 并按照亚历山大所说的去做。

标签: arrays swift dictionary filter


【解决方案1】:

这可以通过根据内部字典键对元素进行分组,然后选择每个组的最后一个元素来完成

let selected = Dictionary(grouping: randomData, by: { $0.keys.first })
    .compactMap { $0.value.last }

正如@Alexander 在 cmets 中所建议的,这可以使用Dictionary(_:uniqueKeysWith:) 更直接地解决

let selected = Dictionary(randomData.flatMap { $0 }, uniquingKeysWith: {
    return $0 > $1 ?  $0 : $1
})

这两种解决方案产生的结果略有不同,第一种是字典数组,第二种是字典,如下所示

第一个解决方案:[[2: 0.5237581], [4: 0.5928725], [5: 0.32073426], [0: 0.3142548]]
第二种解决方案:[0: 0.3142548, 5: 0.32073426, 4: 0.5928725, 2: 0.5237581]

【讨论】:

  • 您也可以使用Dictionary.init(_:uniquingKeysWith:)。每次发生碰撞时,您都会采用两个值中的最新值。最后,您将得到一个将键映射到最后一个值的 dict,并且您将避免中间的数组字典
  • @Alexander 谢谢。打破旧习惯(解决方案)总是好的,Dictionary(grouping:by:) 肯定适合我。
猜你喜欢
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多