gpt4 book ai didi

swift - 反向压缩一个集合

转载 作者:行者123 更新时间:2023-11-28 10:06:31 25 4
gpt4 key购买 nike

我想对一个系列进行“反向压缩”。本质意思:

let a = [1, 2, 3, 4, 5, 6, 7]
let (left, right) = a.reverseZip()

print(left) // [1, 3, 5, 7]
print(right) // [2, 4, 6]

我有一个似乎可行的实现(请参阅下面列出的我的回答),但我有两个问题希望我们可以讨论:

  1. 这种操作的正确名称是什么?它与 zip 并不完全相反(我确信这种模式存在于另一种函数式语言的其他地方)
  2. 是否有针对此方法的更优算法?

最佳答案

这是一个想法的种子。与其返回数组,不如返回序列更有效率。

这是一个 Array返回两个 LazyMapSequence<StrideTo<Int>, Element> 的扩展.优点是它实际上并不生成序列;它们是按需提供的,因为它们是 lazy .这很像 reversed() 的方式在 Array 上工作.

extension Array {

func reverseZip() -> (LazyMapSequence<StrideTo<Int>, Element>, LazyMapSequence<StrideTo<Int>, Element>) {

let left = stride(from: 0, to: self.count, by: 2).lazy.map { self[$0] }
let right = stride(from: 1, to: self.count, by: 2).lazy.map { self[$0] }

return (left, right)
}
}

示例:

let a = [1, 2, 3, 4, 5, 6, 7]
let (left, right) = a.reverseZip()

// iterate left
for i in left {
print(i)
}
1
3
5
7
// turn them into arrays to print them
print(Array(left))
[1, 3, 5, 7]
print(Array(right))
[2, 4, 6]

我确信这可以概括为比 Array 更一般的东西.这是留给读者的练习。


如果你想要两个数组

如果您真的想要这两个数组,那么您只需返回 map 的结果即可(取出 lazy ):

extension Array {

func reverseZip() -> ([Element], [Element]) {

let left = stride(from: 0, to: self.count, by: 2).map { self[$0] }
let right = stride(from: 1, to: self.count, by: 2).map { self[$0] }

return (left, right)
}
}

关于swift - 反向压缩一个集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52616374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com