繁体   English   中英

Haskell - 删除元组列表中的 n 个最小元素

[英]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.Listdrop ,您可以执行以下操作:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM