[英]Haskell - Remove n smallest elements in a list of tuples
我有以下代码,它采用 int 值并删除列表中的前 n 个元素。
removeEle :: Int -> [a] -> [a]
removeEle n xs
| ((n <= 0) || null xs) = xs
| otherwise = removeEle (n-1) (tail xs)
我将如何 append 这样才能按第二个元素对元组列表起作用? ETC
[(String1, 50)], [(String2, 600)], [(String3, 10)]
您无法修改当前解决方案以删除前n
最小元素。 为了能够删除前n
最小的,您需要对整个列表进行总排序,以便您可以决定哪些元素在n
最小的区间内。
一个简单的解决方案是对列表进行排序并删除前n
元素。 但是,此解决方案不会保留原始顺序。
使用soryBy
并从Data.List
中drop
,您可以执行以下操作:
removeNSmallest :: Ord a => Int -> [(String, a)] -> [(String, a)]
removeNSmallest n xs = drop n $ sortBy (\(_, a) (_, b) -> compare a b) xs
正如@Micha Wiedenmann 指出的那样,您可以使用sortBy (比较 snd)对元组进行排序。
一个小测试:
λ> removeNSmallest 1 [("String1", 50), ("String2", 600), ("String3", 10)]
[("String1",50),("String2",600)]
为了保留原始顺序,一种解决方案是为元组的第二个元素创建一个单独的有序列表。 然后遍历原始列表,对于有序列表中的每个元素,从原始列表中删除一个。
如果您使用drop
编写它,则删除列表的前 n 个元素的原始解决方案将更具可读性:
removeEle :: Int -> [a] -> [a]
removeEle n xs = drop n xs
或者,如果您想使用显式递归:
removeEle :: Int -> [a] -> [a]
removeEle _ [] = []
removeEle 0 xs = xs
removeEle n x:xs = removeEle (n-1) xs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.