问题是要获取列表中每个元组的第一个元素的列表。 Erlang让我很难受。如何在erlang列表中动态添加元素?
which python3
这些是元组的,我需要以下列表: [吉尔,乔,鲍勃,苏,帕特]
答案 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]
其中ReturnValue
是firsts(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).