如何从erlang中的元组列表访问值并从中创建一个新列表?

时间:2019-06-15 23:18:11

标签: erlang

问题是要获取列表中每个元组的第一个元素的列表。 Erlang让我很难受。如何在erlang列表中动态添加元素?

which python3

这些是元组的,我需要以下列表: [吉尔,乔,鲍勃,苏,帕特]

3 个答案:

答案 0 :(得分:2)

如果有

List = [{jill,450}, {joe,157}, {bob,100}, {sue,125}, {pat,344}]

然后

[Name || {Name, _} <- List]

将得到[jill, joe, bob, sue, pat]。这是列表理解,请详细了解here

答案 1 :(得分:2)

您可以使用lists:unzip/1 function将成对的元组列表分成两个列表的元组,一个用于第一个元素,一个用于第二个元素:

{Names, _Amounts} = lists:unzip([{jill,450}, {joe,157}, {bob,100}, {sue,125}, {pat,344}]).

产生的Names变量绑定到[jill,joe,bob,sue,pat]

答案 2 :(得分:0)

如果您还没有涵盖列表推导,则可以通过简单的递归来解决问题:

-module(my).
-compile([export_all]).

firsts([]) -> [];
firsts([Tuple|Tuples]) ->
    {Name, _Amount} = Tuple,
    [Name | firsts(Tuples)].

您可以在代码中使用 list文字来代替您的createList()函数(顺便说一句,约定是将该函数命名为create_list())。列表:

[Name | firsts(Tuples)]

在外壳中:

~/erlang_programs$ erl
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]
Eshell V9.3  (abort with ^G)

1> c(my).
my.erl:2: Warning: export_all flag enabled - all functions will be exported
{ok,my}

2> Data = List = [{jill,450}, {joe,157}, {bob,100}, {sue,125}, {pat,344}].
[{jill,450},{joe,157},{bob,100},{sue,125},{pat,344}]

3> my:firsts(Data).
[jill,joe,bob,sue,pat]

4>

该解决方案利用了可以这样定义列表的事实:

1> [1 | [2 | [3 | []]]].
[1,2,3]

所以这部分:

[Name | firsts(Tuples)].

成为:

[Name1 | ReturnValue]

其中ReturnValuefirsts(Tuples)返回的内容,即:

[Name2 | ReturnValue]

代入第一个结果:

[Name1 | [Name2 | ReturnValue]]

再次,返回值是firsts(Tuples)返回的值,即:

[Name3 | ReturnValue]

再次替换将为您提供:

[Name1 | [Name2 | [Name3 | ReturnValue]]]

而且,当ReturnValue是一个空列表时,您将得到:

[Name1 | [Name2 | [Name3 | [] ]]]

这正是结束列表所需要的。比较:

[1 | [2 | [3 | [] ]]].

进行递归的另一种方法(通常更容易弄清楚)是使用 accumulator

-module(my).
-compile([export_all]).

firsts(List) ->
    firsts(List, []).  % Add an empty list to the function call

firsts([Tuple|Tuples], Names) -> % The empty list gets assigned to Names
    {Name, _Amount} = Tuple,
    firsts(Tuples, [Name|Names]);
firsts([], Names) ->
    lists:reverse(Names).

Names被称为累加器,因为它用于累加您要返回的结果。通常,您不会看到变量名为Names(对于累加器),而不是调用变量Acc

请注意这两行:

firsts([Tuple|Tuples], Names) ->
    {Name, _Amount} = Tuple,
    ...

通常被组合成这样的一行:

firsts([{Name, _Amount}|Tuples], Names) ->

例如,像这样进行匹配:

27> [{Name, Amount}|Tuples] = [{jane, 250}, {bob, 100}, {kat, 150}].
[{jane,250},{bob,100},{kat,150}]

28> Name.
jane

这意味着第一个解决方案变为:

firsts([]) -> [];
firsts([{Name, _Amount}|Tuples]) ->
    [Name | firsts(Tuples)].

第二个解决方案变为:

firsts(List) ->
    firsts(List, []).  % Add an empty list to the function call

firsts([{Name, _Amount}|Tuples], Names) -> % The empty list gets assigned to Names
    firsts(Tuples, [Name|Names]);
firsts([], Names) ->
    lists:reverse(Names).