This seems needlessly complex, but perhaps more efficient than what I would suggest:

```erlang
All = [ Node || {_, Node} <- Preflist ],
{Down, Up} = lists:partition(fun(Node) -> lists:member(Node, Unavailable) end, All)
```

I also noticed that it's possible for a Node to appear in the `unavailable_nodes` or `available_nodes` more than once. Is that intentional?