Поиск элемента с пониманием списка Эрланга - PullRequest
1 голос
/ 13 марта 2019

У меня есть список, который содержит кортеж со списком и атом.Например:

List = [{[#{aem => "sara",age => "12"},#{aem => "hanna",age => "11"}], blah},
        {[#{aem => "han",age => "12"},#{aem => "anna",age => "21"}], blah1}].

Я хочу получить запись, которая соответствует aem == "sara", и включить в результат второй элемент из кортежа (в данном случае blah).

Требуемый результат: {[#{aem =>"sara",age=>"12"], blah}

Ответы [ 3 ]

2 голосов
/ 13 марта 2019
1> List = [{[#{aem => "sara",age => "12"},#{aem => "hanna",age => "11"}], blah},
1>         {[#{aem => "han",age => "12"},#{aem => "anna",age => "21"}], blah1}].
[{[#{aem => "sara",age => "12"},
   #{aem => "hanna",age => "11"}],
  blah},
 {[#{aem => "han",age => "12"},#{aem => "anna",age => "21"}],
  blah1}]
2> [ {L, Y} || {X, Y} <- List, L <- [[M || M<-X, maps:get(aem, M) =:= "sara"]], L =/= []].
[{[#{aem => "sara",age => "12"}],blah}]
0 голосов
/ 14 марта 2019

Если вы можете предположить, что aem несколько уникальны (по крайней мере, в каждой группе из людей ):

 [{[Person], Atom} || {People, Atom} <- List, Person = #{aem := "sara"} <- People].

Это даст следующий результат:

[{[#{aem => "sara",age => "12"}],blah}]

Но, чтобы точно соответствовать ожидаемому результату, вам нужно выбрать только один элемент из этого списка. Вы можете использовать hd/1 для этого (если вы знаете, что у вас всегда будет хотя бы один элемент, или вы не против разбиться, если не:

 1> hd([{[Person], Atom} || {People, Atom} <- List, Person = #{aem := "sara"} <- People].
 {[#{aem => "sara",age => "12"}],blah}
0 голосов
/ 13 марта 2019

Вы можете разбить свое второе понимание списка, как показано ниже:

-module(foo).
-compile(export_all).
start()->
    List = [{[#{aem => "sara",age => "12"},
              #{aem => "hanna",age => "11"}], "blah"},
            {[#{aem => "han",age => "12"},
              #{aem => "anna",age => "21"}], "blah1"}],
    listcomp(List).
listcomp([]) -> [];
listcomp([{P, Dir} | T]) ->
    case [X || X <- P, maps:get(aem, X) == "sara" ] of
        [] -> listcomp(T);
        Res -> [{Res, Dir} | listcomp(T)]
    end.
...