0

我想在字典上调用 map 并获取它们的值列表。Erlang 没有内置到 dict 模块中,所以这就是我解决这个问题的方法:

Fn = fun(Tuple) ->
  [Key, Value] = Tuple,
  string:join([Key, Value], "=")
end,
lists:map(Fn, dict:to_list(Dict)).

问题是 Key 和 Value 会被多次分配。如何“拆分”dict:to_list匿名函数调用内部返回的键/值元组string:join

4

3 回答 3

3

由于您有一个带有列表作为值的元组列表,因此您可能看起来像这样:

[字符串:加入([K,V],“=”)|| {K, 值} <- dict:to_list(Your_dictionary), V <- 值]。

希望这可以帮助

于 2012-09-22T20:19:09.310 回答
2

我不确定我是否遵循您在这里的要求。“键和值被多次分配”是什么意思?

当您说要映射字典并返回值列表时,您是指“键值”意义上的值吗?在这种情况下,您可以这样做:

Values = [V || {_,V} <- dict:to_list(Dict)].

这只会为您提供字典的键值性质的“价值”方面的列表。

你也可以通过做类似的事情来获得一个键列表。

Keys = [K || {K,_} <- dict:to_list(Dict)].

如果您只想将 Key 和 Values 列表分开,您可以使用 lists:unzip/1。

{Keys, Values} = lists:unzip(dict:to_list(Dict)).

然后Keys将是所有键的列表,并且Values将是所有值的列表。

Key或者您是否关心为您的字典的每个成员分配和Value都被分配(如在变量分配中)的事实?如果是这样,不要。这些分配很快,只是指针,而不是内存副本。

于 2012-09-23T00:32:40.163 回答
1

以前从未处理过 dict 模块的相对新手,但这似乎对我有用:

dict:fold(fun(Key, Value, Accum) ->
                  [Value | Accum] end, [], D).

例子:

init() ->
    Dict = dict:new(),
    Dict2 = dict:append(key, value, Dict),
    Dict3 = dict:append(key2, value2, Dict2),
    dict:append(key3, value3, Dict3).

grab_values(D) ->
    dict:fold(fun(Key, Value, Accum) ->
                      [Value | Accum] end, [], D).

调用:

4> D = dictfold:init().
{dict,3,16,16,8,80,48,
      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
      {{[],[],
        [[key2,value2]],
        [[key3,value3]],
        [],[],[],[],[],
        [[key,value]],
        [],[],[],[],[],[]}}}
5> dictfold:grab_values(D).
[[value2],[value3],[value]]
于 2012-09-22T20:09:14.657 回答