【发布时间】:2014-09-10 08:12:18
【问题描述】:
这是我的问题:
如何从两个相等长度的列表中提取相同的元素到另一个列表?
例如:给定两个列表[2,4,6,3,2,1,3,5] 和[7,3,3,2,8,8,9,1],答案应该是[1,2,3,3]。请注意,顺序无关紧要。我实际上是在使用返回列表的长度。
我试过了:
sameElem as bs = length (nub (intersect as bs))
但问题是nub 删除了所有重复项。对前一个例子使用我的函数的结果是3[1,3,2]的长度而不是4[1,3,3,2]的长度。有解决办法吗?谢谢。
【问题讨论】:
-
这里的位置是否相关,如示例所示?如果是这样,您可以将列表压缩到 [(1,1),(3,3),(3,3),(2,2),(4,5)...] 并删除其中的条目fst 不是 snd。
-
位置与这里无关。我已经改变了这个例子。谢谢。
-
好的,那么还有一个类似的解决方案。请注意,
(\l-> \k-> [x|x<-l,y<-k,x==y]) [2,4,6,3,2,1,3,5] [7,3,3,2,8,8,9,1]会找到所有匹配项,然后返回[2,3,3,2,1,3,3]。您可以通过索引第一个列表并最终删除重复出现的值来消除重复计算。 -
NikolajK,或者您可以在结果上使用 Data.List 中的 nub 来删除重复项。
-
@fgv: 不,如果他通过
[7,9,7]和[3,7,7,7],他希望输出为[7,7],参见上面的示例。我的方法会首先找到六对,然后根据索引删除其中四对,得到正确的结果。如果我们只申请nub,那么我们总是只能找到一个。
标签: haskell