【问题标题】:How to read each element within a tuple from a list如何从列表中读取元组中的每个元素
【发布时间】:2015-09-19 18:42:13
【问题描述】:

我想编写一个程序,它会读取一个元组列表,并且在元组中它将包含两个元素。第一个元素可以是一个对象,第二个元素将是该对象的数量。就像:Mylist([{Object1,Numbers},{Object2, Numbers}])
然后我想读入Numbers 并打印相关的对象Numbers 次,然后将它们存储在一个列表中。
所以如果Mylist([{lol, 3},{lmao, 2}]),那么我应该得到[lol, lol, lol, lmao, lmao]作为最终结果。
我的想法是首先将这些元组(想象一下,如果有超过 2 个)解压缩成两个元组,第一个包含对象,第二个包含数量。
之后读取第二个元组中的数字,然后在第一个元组中打印相关的对象以及确切的时间。但我不知道该怎么做。谢谢你的帮助!

【问题讨论】:

    标签: list erlang tuples


    【解决方案1】:

    列表推导可以做到这一点:

    lists:flatten([lists:duplicate(N,A) || {A, N} <- L]).
    

    如果你真的也想打印,请使用递归:

    p([]) -> [];
    p([{A,N}|T]) ->
        FmtString = string:join(lists:duplicate(N,"~p"), " ")++"\n",
        D = lists:duplicate(N,A),
        io:format(FmtString, D),
        D++p(T).
    

    此代码为io:format/2 创建一个格式字符串,使用lists:duplicate/2 复制"~p" 格式说明符N 次,将它们与string:join/2 的空格连接起来,并添加一个换行符。然后它再次使用lists:duplicate/2 来获取AN 副本列表,使用格式字符串打印那些N 项目,然后将列表与递归调用的结果组合以创建函数结果。

    【讨论】:

    • 请问string:join在程序这里是做什么的?
    • string:join/2 调用在重复的"~p" 字符串之间放置空格。例如,如果N 为 3,则lists:duplicate(3, "~p") 返回["~p","~p","~p"],并由此string:join(lists:duplicate(3,"~p"), " ") 生成字符串"~p ~p ~p"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多