Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从列表列表中删除整数对,同时保持原始顺序-Haskell_Haskell - Fatal编程技术网

从列表列表中删除整数对,同时保持原始顺序-Haskell

从列表列表中删除整数对,同时保持原始顺序-Haskell,haskell,Haskell,我一直在努力从列表中删除重复项,同时保留剩余项和空列表的原始位置。比如说: list1 = [[1],[2],[1,2],[4],[1,4]] list2 =[[1],[2],[1,2],[4],[1,4],[2,4]] list3 = [[1,2,4],[1,4],[2,4],[1,4],[1,2,4]] 那么输出应该是: [[],[],[],[],[1]] [[],[],[],[],[1],[2,4]] [[],[],[,],[],[2,4]] (删除哪些对并不重要) 但是,只有先展

我一直在努力从列表中删除重复项,同时保留剩余项和空列表的原始位置。比如说:

list1 = [[1],[2],[1,2],[4],[1,4]]
list2 =[[1],[2],[1,2],[4],[1,4],[2,4]]
list3 = [[1,2,4],[1,4],[2,4],[1,4],[1,2,4]]
那么输出应该是:

[[],[],[],[],[1]]

[[],[],[],[],[1],[2,4]]

[[],[],[,],[],[2,4]]
(删除哪些对并不重要)

但是,只有先展平列表,然后再丢失空列表的原始位置,我才能使其工作。如果有人知道我如何着手解决这个问题,我将不胜感激

代码很混乱,但适用于平面列表:

remPair [] = []
remPair (x:xs) = if elem x xs then
                    let
                      n = elemIndices x xs
                      (ys, zs) = splitAt (head n) xs
                      in remPair (ys ++ (drop 1 zs))
                  else  [x] ++ remPair xs
正确回答 我试图用Haskell-y的方法来解决这个问题,但是这段代码的性能非常糟糕,而且很难阅读。我只是想看看我是否能解决这个问题

导入数据列表(elemIndices)
附录头::a->[[a]]->[[a]]
附录x[]=[[x]]
附加头x(ys:yss)=(x:ys):yss
--|计算元素在列表列表中出现的次数
计数::等式a=>a->[[a]]->Int
计数[]=0
计数x(ys:yss)=(长度$elemIndices x ys)+计数x yss
--|为简单起见,假设计数为1或更大
rmAllButLast::Int->Int->[[Int]]->[[Int]]
rmAllButLast x xCount yss=
如果xCount==0
那么yss呢
其他的
让protectLastElement cond=如果偶数为xCount,则在
snd$
福尔德尔
(\(xIndex,acc)ys->
(\y->acc++[y])foldl
(\(xIndex,acc)y->
如果protectLastElement(xIndex[[Int]]
rmPairs[]=[]
rmPairs([]:yss)=[]:rmPairs yss
rmPairs((x:xs:yss)=
设xCount=count x(xs:yss)in
如果xCount==0
然后追加x$rmPairs(xs:yss)
else rmPairs$rmAllButLast x xCount(xs:yss)
旧反应 编辑:下面的代码不是作者想要的,但我会留下它,这样下面的评论才有意义

如果要删除重复项(任何发生一次或多次的都将减少为一个值)或实际对(此值有两个,所以请同时删除这两个值,如果有偶数个x,则它们将全部删除,如果是奇数个x,则将有一个)。假设为前者且不考虑性能:

remPair::[[Int]]->[[Int]]
remPair[]=[]
remPair([]:yss)=[]:remPair yss
remPair(xs:yss)=remPairFromFlat xs:remPair yss
哪里
flatYss=concat yss
remPairFromFlat[]=[]
remPairFromFlat(z:zs)=
让flat=zs++flatYss进入
如果z`elem`flat
然后从平面Z上重新排列
else z:REMPAIRFROM平面z

remPair
迭代列表列表。如果第一个列表不是空的,它会将列表的其余部分展平,然后遍历
xs
的元素,并创建
ys
的本地平面列表和
xs
的尾部!谢谢你的回答,但我确实想删除这对。我将更新问题中的示例:)我最终做的是转换为二进制,然后将XOR映射到转置列表。这最终达到了我所需要的目的,但我仍然不知道如何才能更普遍地做到这一点。因此,我将保留这个问题,希望有人知道:)我想我已经弄明白了,尽管我很好奇代码是否清晰。是的,这很有效!我想我知道你的函数是怎么做的,虽然我对haskell不太熟悉,所以我可能会忘记更精细的细节:)在试图解决这个问题时,你似乎解决了我的主要问题,那就是如何跟踪哪些子列表有和没有检查elem x,然后从该子列表的右索引中删除该元素。我的代码很快就变成了一团乱麻!我觉得你的逻辑更容易理解。非常感谢。