给出Swift中的两个列表:
let rows = ["a", "b", "c"]
let cols = ["1", "2", "3"]
是否可以使用列表理解来组合它们以产生以下内容:
squares = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]
显然,可以使用" for循环"和类似的结构,但我特别是基于列表理解的解决方案。我知道Swift可以做一些列表理解(例如,让evens = Array(filter(1 ..< 10){$ 0%2 == 0}))但是无法弄清楚它是否可以做类似于以下是Haskell:
let squares = [ r ++ c | r <- rows, c <- cols]
答案 0 :(得分:4)
一种可能的解决方案(现已针对 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
数组到一个数组数组(每行一个)并展平结果。
略微更为笼统,人们可以定义两个“产品” 序列作为具有所有组合的元组(对)的数组:
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(+)