我有一个元组列表,其中每个元组代表一个像素的行和列。我如何有效地构建一个列表,对于第一个列表中的每个(i, j)
元组,新列表中i*width + j
位置的元素的值是1?
答案 0 :(得分:1)
首先,对点列表进行排序
let sortedPoints = sort [(0, 1), (1, 0), (1, 1)]
-- == [(0, 0), (0, 1), (1, 0)]
然后,创建所有点的列表
let allPoints = [(x, y) | x <- [0, 3], y <- [0, 3]]
-- where I chose width = 3
-- = [(0,0),(0,1),(0,2),(0,3),(1,0),(1,1),(1,2),(1,3),(2,0),(2,1),(2,2),(2,3),(3,0),(3,1),(3,2),(3,3)]
请注意,这会自动排序。
最后,编写一个逐个遍历项目的函数,并检查列表sortedPoints中的哪些项目在allPoints中
isIn::[(Int, Int)]->[(Int, Int)]->[Int]
isIn [] [] = []
isIn (first:rest) (allFirst:allRest) | first == allFirst = 1:isIn rest allRest
isIn points (_:rest) = 0:isIn points rest
然后只计算
isIn sortedPoints allPoints