2017-06-11 44 views
1

以下代碼片段有什麼問題?Erlang列表:keyfind/3不按預期工作

> A = [{X, 1} || X <- lists:seq(1,5)]. 
> lists:keyfind({3,1}, 1, A). 
false 

爲什麼函數返回false?理想情況下它應該返回{3,1}。

+1

爲什麼你期望它返回'{3,1}'? 'list:keyfind/3'只搜索列表中每個元組的第N個(本例中爲1)項,而不是整個事物。你的意思是做'list:keyfind(3,1,A).'? – Dogbert

+0

我想我不明白這個函數的第二個參數。這個'N'是什麼意思?如果我想匹配'{3,1}'而不是'3',該怎麼辦? –

回答

4

lists:keyfind/3通過將每個元組的N th值與給定值進行比較來搜索元組列表。您的代碼正在搜索第一個元素爲{3, 1}的元組,該元組不存在於您的列表中。要搜索的元組,其第一個元素是3,你可以做lists:keyfind(3, 1, A).

1> A = [{X, 1} || X <- lists:seq(1,5)]. 
[{1,1},{2,1},{3,1},{4,1},{5,1}] 
2> lists:keyfind({3,1}, 1, A). 
false 
3> lists:keyfind(3, 1, A). 
{3,1} 

如果你想找到一個確切值,你可以使用lists:member/2來檢查它是否存在:

4> lists:member({3,1}, A). 
true