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)
我将如何追加它以便它按第二个元素作用于元组列表?等等
[(String1, 50)], [(String2, 600)], [(String3, 10)]
您无法修改当前的解决方案以删除前 n
个最小的元素。为了能够删除第一个 n
最小的,您需要对整个列表进行总排序,以便您可以决定哪些元素在 n
最小间隔中。
一个简单的解决方案是对列表进行排序并删除前 n
个元素。尽管此解决方案不保留原始顺序。
使用 Data.List
中的 soryBy
and drop
,您可以执行以下操作:
removeNSmallest :: Ord a => Int -> [(String, a)] -> [(String, a)]
removeNSmallest n xs = drop n $ sortBy (\(_, a) (_, b) -> compare a b) xs
正如@Micha Wiedenmann 指出的那样,您可以使用 sortBy (comparing 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
我得到以下代码,它接受一个 int 值并删除列表中的前 n 个元素。
removeEle :: Int -> [a] -> [a]
removeEle n xs
| ((n <= 0) || null xs) = xs
| otherwise = removeEle (n-1) (tail xs)
我将如何追加它以便它按第二个元素作用于元组列表?等等
[(String1, 50)], [(String2, 600)], [(String3, 10)]
您无法修改当前的解决方案以删除前 n
个最小的元素。为了能够删除第一个 n
最小的,您需要对整个列表进行总排序,以便您可以决定哪些元素在 n
最小间隔中。
一个简单的解决方案是对列表进行排序并删除前 n
个元素。尽管此解决方案不保留原始顺序。
使用 Data.List
中的 soryBy
and drop
,您可以执行以下操作:
removeNSmallest :: Ord a => Int -> [(String, a)] -> [(String, a)]
removeNSmallest n xs = drop n $ sortBy (\(_, a) (_, b) -> compare a b) xs
正如@Micha Wiedenmann 指出的那样,您可以使用 sortBy (comparing snd) 对元组进行排序。
小测试:
λ> removeNSmallest 1 [("String1", 50), ("String2", 600), ("String3", 10)]
[("String1",50),("String2",600)]
要保留原始顺序,一种解决方案是为元组的第二个元素创建一个单独的有序列表。然后遍历原始列表,对于有序列表中的每个元素,从原始列表中删除一个。
如果您使用 drop
:
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