2017-09-29 9 views
0

Ich möchte auszufiltern die Nummer 2 in dieser Liste der Listen:Elemente in der Liste der Listen

myList = [[1,2,3],[1,2],[2,1,3,4]] 

... so, dass, wenn ich diese Länge Funktion:

noTwos xs = map length [x|x<-xs] 

Ich bekomme das Ergebnis [2,1,3].

Ich versuchte mit [x|x<-xs, x/=[2] ], aber das filtern nur die Liste von [2] als Elemente, wie filtere ich die 2 in allen Unterlisten?

+1

Haben Sie versucht, nes Diese Listen-Comprehensions? Der äußere sollte wie der in 'noTwos' aussehen. Anstatt die 'x' zu sammeln, mache ein zweites Listenverständnis, um die '2' herauszufiltern. – mschmidt

+0

hm .. ich sehe nicht, wo ich das zweite Listenverständnis einfügen sollte in –

+1

So etwas wie '[[x | x <-xs, x/= 2] | xs <-xss] ' – mschmidt

Antwort

1

Dies scheint gut zu funktionieren:

map (filter (/= 2)) [[1,2,3],[1,2],[2,1,3,4]] 

Karte Sie über die äußere Liste, und jede Unterliste filtern.

0

Alternativ zu Ulrar map . filter Version, die in der Tat besser lesbar ist. Mit List's difference (\\) sollte auch funktioniert (ImportData.List erforderlich):

no2s = map (\\ [2]) 

Hinweis, dass diese leere Listen bei [...,[2],...]

Bei lässt Sie leere loszuwerden Listen, filtern Sie sie einfach aus:

no2s = filter (not . null) . map (\\ [2])