2014-02-20 40 views
0

我有一个元组列表,我想从元组中的特定位置创建元素列表。Erlang通过分割元组列表创建列表

我的元组是{A,B},我在列表中有几个这样的元素,我想创建所有B元素的列表。

干杯!

+0

的可能重复[如何建立一个从Erlang中的元组列表中提取的元素?](http://stackoverflow.com/questions/23626189/how-do-i-build-a-list-of-elements-extracted-from-a-list- erlang-er-erlang) – aronisstav

回答

0

这是一个快速样本,未经过测试,但应该可以工作。

split_tuples([{A | B} | T], Acc) -> 
    NewAcc = [B | Acc], 
    split_tuples(T, NewAcc); 
split_tuples([], Acc) -> 
    lists:reverse(Acc). 
3

您可以使用列表:地图。

1> A = [{1,2},{3,4},{5,6}]. 
[{1,2},{3,4},{5,6}] 
2> B = lists:map(fun ({_, V}) -> V end, A). 
[2,4,6] 

传递给地图功能将选择从元组所需要的元素,其结果将是,在元组的给定列表的特定位置的所有元素的列表。上面的代码假定所有的元组都有相同数量的元素。

+0

欢呼!正常工作 – user2270439

1
> L = [{a1,b1}, {a2,b2}, {a3,b3}]. 
[{a1,b1},{a2,b2},{a3,b3}] 
> lists:foldr(fun({_, B}, Acc) -> [B | Acc] end, [], L). 
[b1,b2,b3] 
0

erlang's element/2函数就是这样做的:从元组返回第n个元素。

把它放在地图或折叠函数中,并将位置作为参数,就完成了。


编辑:一些未经测试的代码示例:

get_them_all(ListOfTuples,Index) -> 
    lists:map(fun(Tuple) -> element(Index,Tuple) end,ListOfTuples). 
3

还有一种方法是只使用一个简单的列表理解:

[B || {_, B} <- L]. 
+0

如果你选择这个解决方案,这将是方便的:如果列表包含与其他2个元素的元组,它们将被默默跳过。例如:'[b1,b2] = [B || {_,B} < - [{a1,b1},{a2,b2},{a3,b3,c3}]]在某些情况下, – danechkin