목록에서 고유 한 요소를 제거하면 자주 발생하는 요소 만 남게됩니다 (서곡 기능 만 사용). 예를목록에서 고유 한 요소를 제거하려면 어떻게해야합니까? Haskell
에 대한["abc","abc","a","b","c","b"]
가 반환 :
["abc","b"]
를 모든 요소가 정확히 한 번만 발생하는 경우, 모두 반환됩니다.
도움이된다면 이미 정렬 기능을 구현했습니다.
목록에서 고유 한 요소를 제거하면 자주 발생하는 요소 만 남게됩니다 (서곡 기능 만 사용). 예를목록에서 고유 한 요소를 제거하려면 어떻게해야합니까? Haskell
에 대한["abc","abc","a","b","c","b"]
가 반환 :
["abc","b"]
를 모든 요소가 정확히 한 번만 발생하는 경우, 모두 반환됩니다.
도움이된다면 이미 정렬 기능을 구현했습니다.
정렬 후에는 반복 요소에 대해 패턴 일치를 수행하고 나머지는 모두 삭제할 수 있습니다.
dropSingles [] = []
dropSingles (x:y:rest) | x == y = x:dropSingles (dropWhile (== x) rest)
dropSingles (x:rest) = dropSingles rest
어때?
import Data.List
getDups :: Ord a => [a] -> [a]
getDups = map head . filter (\l -> length l > 1) . group . sort
같은 요소가 인접 해있을 때만 그룹이 작동하기 때문에 먼저 목록을 정렬합니다. 그런 다음 둘 이상의 요소가있는 그룹을 필터링합니다. 이미 적어도 하나가 있다는 것을 이미 알고 있으므로 각 그룹의 첫 번째 요소를 취합니다.
매우 유용합니다. 그러나 그룹을 사용하지 않고이 작업을 수행하는 것은 어쨌든 제가 서곡 기능 만 사용해야한다고 생각하십니까? 그렇지 않다면, 나는 그것을 구현하려고 할 수 있다고 생각합니다. – Arthur
직접 작성하십시오. 나는 이것이 숙제라고 생각하고있다. – DiegoNolan
import Data.List
f xs = case nub (xs \\ nub xs) of
[] -> xs
xs' -> xs'
main = do
print $ f ["abc","abc","abc","a","b","c","b"] -- ["abc","b"]
print $ f ["abc","a","c","b"] -- ["abc","a","c","b"]
즉, 각 요소를 한 번 제거한 다음 각 요소를 한 번 반환하십시오.
간결하지만,'nub'은 다소 터무니없이 비효율적입니다. – dfeuer
'filter'는 다른 방식으로 작동합니다. 당신은'/ =' – DiegoNolan
@ DiegoNolan- 내 잘못, 캐치에 대한 감사합니다. 수정되었습니다. – jamshidh
필터 부분이 내가 원하는 것을하지 않습니다. 한 번만 발생하는 목록 요소를 제거하지 않고 단일 문자로 목록 요소를 제거합니다. – Arthur