【问题标题】:Erlang creating list by splitting a list of tuplesErlang 通过拆分元组列表来创建列表
【发布时间】:2014-02-21 05:31:41
【问题描述】:

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

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

干杯!

【问题讨论】:

标签: list erlang tuples


【解决方案1】:

您可以使用列表:地图。

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]

传递给映射的函数将从元组中选择所需的元素,结果将是给定元组列表中该特定位置的所有元素的列表。上面的代码假设所有元组都有相同数量的元素。

【讨论】:

  • 干杯!效果很好
【解决方案2】:

另一种方法是只使用简单的列表推导:

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

【讨论】:

  • 如果您选择此解决方案,这将很方便:如果列表包含具有其他 2 个元素的元组,它们将被静默跳过。例如:[b1, b2] = [ B || {_, B} &lt;- [{a1, b1}, {a2, b2}, {a3, b3, c3}] ]. 在某些情况下它是可取的,在某些情况下不是。
【解决方案3】:
> 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]

【讨论】:

    【解决方案4】:

    这是一个快速示例,未经测试,但应该可以工作。

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

    【讨论】:

      【解决方案5】:

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

      将其放入 map 或 fold 函数中,并以位置为参数,就完成了。


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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-23
        • 2022-08-13
        • 2011-03-28
        • 1970-01-01
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多