gpt4 book ai didi

list - 根据位置从列表中删除多个元素

转载 作者:行者123 更新时间:2023-12-04 04:40:08 25 4
gpt4 key购买 nike

我想从列表中删除一些元素。到目前为止,我有一个删除功能:

deleteElem :: Int -> [a] -> [a]
deleteElem _ [] = []
deleteElem x zs | x > 0 = take (x-1) zs ++ drop x zs
| otherwise = zs

我想删除例如两个位置,它们存储在元素列表中的列表中。
所以这很好用:
map (deleteElem 2) [["hello", "whatever", "foo", "bar"], ["hello", "whatever", "foo", "bar"], ["hello", "whatever", "foo", "bar"], [hello", "whatever", "foo", "bar"]]

我会得到结果:
[["hello", "whatever", "bar"], ["hello", "whatever", "bar"], ["hello", "whatever", "bar"], [hello", "whatever", "bar"]]

但现在我想申请 deleteElem [2,3]

最佳答案

如果我正确地解释了您的问题,那么您是说您想要一种将函数应用于索引列表而不是一次单个索引的方法。
我能做到的最简单的方法是创建另一个名为deleteElems而不是 deleteElem (注意尾随 s 。)deleteElems将是 [Int] -> [a] -> [a] 类型它会调用每个索引。
注意:请参阅底部的更新以获取正确的解决方案(我将这部分留在此处,以便其他人可以从我最初解决问题的尝试中学习以及为什么它不正确。)
这是一种方法:deleteElems xs zs = foldr (\x z -> deleteElem x z) zs xs可以缩短为:deleteElems xs zs = foldr deleteElem zs xs

Prelude> deleteElems [2,3] [1..10]
[1,4,5,6,7,8,9,10]
或从您的示例中:
Prelude> map (deleteElems [2,3]) [["hello", "whatever", "foo", "bar"], ["hello", "whatever", "foo", "bar"], ["hello", "whatever", "foo", "bar"], ["hello", "whatever", "foo", "bar"]]
[["hello","bar"],["hello","bar"],["hello","bar"],["hello","bar"]]
deleteElems使用 foldr反复调用 deleteElem删除 xs 中的索引来自 zs .对于 foldr 的更深入的解释,见 How does foldr work? .
更新:
根据评论 deleteElems 的上述实现实际上是不正确的,因为当给出索引列表时,例如 [2,4,6] ,它将首先删除索引 2 ,返回一个新列表,然后删除索引 4在新列表上并返回一个更新的列表,然后删除索引 6在较新的名单上。这个过程不是 交换 , 表示改变索引的顺序,或给出 deleteElems指数 [6,4,2]不会做同样的事情。
我使用 intersect 获得预期行为(从原始列表中删除给定索引)的方法函数来自 Data.List :
deleteElems xs zs = foldr1 intersect $ map ($ zs) $ map deleteElem xs
这个新版本的 deleteElems申请 deleteElem使用 xs 中的每个索引,创建 length xs 的列表 deleteElem 的列表数量函数库化到每个特定索引。然后 map ($ zs)应用每个 curry deleteElem函数到 zs ,产生一个列表列表,其中每个内部列表只是 deleteElem应用于指数之一和 zs .最后,我们使用 intersect来自 Data.List找到删除了所有正确元素的列表。
另外,我仍然绝对推荐查看 How does foldr work? .

关于list - 根据位置从列表中删除多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19005484/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com