2012-09-22 53 views
0

我想在dict上調用map並獲取它們的值的列表。二郎神不具有內置的字典模塊,所以這裏是我應得圍繞着:Erlang拆分Tuple

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

的問題是,關鍵和值然後讓多次分配。我怎樣才能將dict:to_list在匿名函數調用中返回的鍵/值元組「拆分」爲string:join

回答

2

我不知道我下面你問這裏。 「密鑰和價值分配多次」是什麼意思?

當你說你想要映射字典並獲取一個值列表時,你的意思是「鍵值」意義上的值嗎?在這種情況下,你可以做一個這樣的:

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

這將只是給你的字典的鍵值性質的「價值」的一面的列表。

你也可以通過做類似的事情來得到一個鍵列表。

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

如果你只是想列出Key和Values分開的列表,你可以使用列表:unzip/1。

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

然後Keys將所有鍵的列表,並Values將是所有值的列表。

或者您是否擔心KeyValue都是爲您的字典的每個成員分配(如在變量賦值中)的事實?如果是這樣,不要。這些任務很快,只是指針,而不是內存拷貝。

1

相對較晚誰以前從未解決的字典模塊,但是這似乎爲我工作:

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]] 
3

當你有列表作爲值的元組列表也許你看起來像這樣:

[string:join([K,V],「=」)|| {K,Values} < - 字典:to_list(Your_dictionary),V < - Values]。

希望這有助於