我在Haskell中有两个列表。
原始列表: ["你好"," HELLO","世界"," WORLD"]
仅限大写列表: [" HELLO"," WORLD"]
你能帮我创建一个函数,它应该返回一个包含两个列表交集索引的列表。
我可以通过这样做获得第一个索引:
让upperIndex = findIndices(==(onlyUpper !! 0))原创
但是,这仅适用于一个实例,在这种情况下,我只能获得" HELLO"的索引。在原始列表中,但我希望得到所有这些。
对于此示例,答案应为: [1,3]
答案 0 :(得分:0)
修改:David Young建议的另一个版本
findIndicesIn xs ys = findIndices (`elem` ys) xs
我更喜欢我的解决方案。
如果我理解正确,你有两个清单。称他们为xs
和ys
。您想在xs
中的每个元素的ys
中找到索引。如果ys
中的元素未包含在xs
中,您就不会提及您要执行的操作,因此我将为您选择合理的内容。这是:
findIndicesIn :: Eq a => [a] -> [a] -> [Maybe Int]
findIndicesIn xs ys = map (`elemIndex` xs) ys
elemIndex :: Eq a => a -> [a] -> Maybe Int
查找列表中给定元素的索引(与(==)
比较)。如果该元素不存在,则返回Nothing
。要查找所有索引,我们会映射ys
中的每个元素,并尝试使用xs
在elemIndex
中找到它。使用Section语法代替flip elemIndex xs
或\y -> elemIndex y xs
来简化。
结果是一个Maybe Int
列表,代表xs
中每个元素的ys
中的可能的索引。请注意,如果您不跟踪缺失的元素,结果列表中索引的位置将不再对应ys
中元素的位置。
你也可以使用更少的点来写这个
findIndicesIn :: Eq a => [a] -> [a] -> [Maybe Int]
findIndicesIn xs = map (`elemIndex` xs)
YMMV哪一个更清楚。两者都是等价的。这个版本是非常易读的IMO。你可以更进一步写下
findIndicesIn = map . flip elemIndex
但我个人认为这不太可读。 YMMV再次。
答案 1 :(得分:-3)
let upperIndex original onlyUpper = helper original 0 where helper [] _ = []; helper (x:xs) i = if elem x onlyUpper then i:(helper xs (i+1)) else helper xs (i+1)
使用示例:
Prelude> upperIndex ["hello", "HELLO", "world", "WORLD"] ["HELLO", "WORLD"]
[1,3]