快速列出产品

标签 swift list-comprehension

给定 Swift 中的两个列表:

let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]

是否可以使用列表理解将它们组合起来以产生以下结果:

squares = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]

显然,可以使用“for 循环”和类似的结构来完成,但我专门针对基于列表理解的解决方案。我知道 Swift 可以做一些列表理解(例如 let Evens = Array(filter(1..<10) { $0 % 2 == 0 }) ),但无法弄清楚它是否可以做类似于以下内容的事情 haskell :

let squares = [ r ++ c | r <- rows, c <- cols]

最佳答案

一个可能的解决方案(现已针对 Swift 2 进行更新):

let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]

let squares = rows.flatMap {
    row in
    cols.map {
        col in
        row + col
    }
}
print(squares)
// [a1, a2, a3, b1, b2, b3, c1, c2, c3]

内部 map()cols 数组映射到具有 每个条目前面的行号。外部 flatMap() map rows 数组转换为数组数组(每行一个数组)并压平结果。

稍微笼统一点,可以定义两个的“乘积” 作为具有所有组合的元组(对)数组的序列:

func product<S : SequenceType, T : SequenceType>(lseq : S, _ rseq : T) -> [(S.Generator.Element, T.Generator.Element)] {
    return lseq.flatMap { left in
        rseq.map { right in
            (left, right)
        }
    }
}

然后将其用作

let squares = product(rows, cols).map(+)

关于快速列出产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30422312/

相关文章:

python - 使用列表推导式向字典中的值加一

python - 我怎么能在列表理解中重写这个 for 循环

python - 使用列表理解打印出一个包含长度为 4 的单词的列表

ios - arc4random_uniform 在 OSX 10.10.4 上的 Xcode 7.0 beta (7a176x) 中不可用

swift - 将 UInt32 转换为通用 T : Numeric

ios - hkworkout totalenergyburned 与 HKQuantityTypeIdentifierActiveEnergyBurned 不相关

ios - 从 AVPlayerViewController 中删除 QuickTime 图标

xml - 究竟要在 XMLDSIG 上消化和签署什么以及如何消化? (或者,OSX 本地客户端与服务器上计算的 XMLDSIG 不匹配)

python - 内联 for in 表达式评估

元组提取的python元组