Erlang: фильтровать элементы из нескольких списков на основе пользовательского ввода

#list #filter #erlang #zip

#Список #Фильтр #erlang #zip

Вопрос:

У меня есть 3 списка в erlang как

 EmpIDList = [10020, 10010, 10040, 10030],
EmpLocation = [Sweden, Germany, USA, Italy],
EmpSalary = [100k, 125k, 165k, 200k]
  

Если пользователь вводит данные как [10040, 10020], то ожидаемый результат — 3 списка:

 [10040, 10020], [USA, Sweden], [165k, 100k].
  

Как этого добиться? Любой ввод будет полезен.

Примечание:

  1. все 3 списка всегда будут иметь одинаковое количество элементов.
  2. Первый элемент из EmpLocation соответствует первому элементу в EmpIDList и так далее.
  3. Первый элемент из EmpSalary соответствует первому элементу в EmpIDList и так далее.

Ответ №1:

Сначала объедините данные из трех списков, используя lists:zip3 , чтобы данные для каждого сотрудника хранились вместе:

 > EmpList = lists:zip3(EmpIDList, EmpLocation, EmpSalary).
[{10020,sweden,100},
 {10010,germany,125},
 {10040,usa,165},
 {10030,italy,200}]
  

Затем используйте lists:keyfind , чтобы получить интересующих вас сотрудников — обратите внимание на список идентификаторов сотрудников ближе к концу:

 > FilteredTuples = [lists:keyfind(Id, 1, EmpList) || Id <- [10040, 10020]].
[{10040,usa,165},{10020,sweden,100}]
  

И, наконец, «разархивируйте» кортежи, чтобы получить нужный вам формат результата:

 > lists:unzip3(FilteredTuples).
{[10040,10020],[usa,sweden],[165,100]}