Swift 列出产品
Swift List Product
给定 Swift 中的两个列表:
let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]
是否可以使用列表理解将它们组合起来产生以下内容:
squares = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]
显然,它可以使用 "for loop" 和类似的结构来完成,但我专门针对基于列表理解的解决方案。我知道 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()
地图
rows
数组到数组数组(每行一个) 并压平 结果。
稍微笼统一点,可以定义两个的"product"
作为具有所有组合的元组(对)数组的序列:
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(+)
给定 Swift 中的两个列表:
let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]
是否可以使用列表理解将它们组合起来产生以下内容:
squares = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]
显然,它可以使用 "for loop" 和类似的结构来完成,但我专门针对基于列表理解的解决方案。我知道 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()
地图
rows
数组到数组数组(每行一个) 并压平 结果。
稍微笼统一点,可以定义两个的"product" 作为具有所有组合的元组(对)数组的序列:
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(+)