Erlang - 两个列表中的常见项

时间:2017-09-09 17:57:28

标签: list erlang

Erlang新手在这里。假设我有两个这样的列表。

   L1= [{'Lady in the Water',2.5},
        {'Snakes on a Plane',3.5},
        {'Just My Luck',3.0},
        {'Superman Returns',3.5},
        {'You, Me and Dupree',2.5},
        {'The Night Listener',3.0}]

L2 = [{'Lady in the Water',3.0},
      {'Snakes on a Plane',3.5},
      {'Just My Luck',1.5},
      {'Superman Returns',5.0},
      {'You, Me and Dupree',3.5}]

我希望像元组列表中的常用评级一样

[{2.5,3.0},{3.5,3.5},{3.0,1.5},{3.5,5.0},{2.5,3.5}]

我的代码就像这样

common_rating(R1,R2)->common_rating(R1,R2,0,0).

common_rating(_X,[],M,N)  ->{M,N};



common_rating(X,[Y|Y1],A,B)->
  {M,R}=X,
  {N,K }= Y,
  case M=/=N of
    true -> common_rating(X,Y1,A,B);
    false -> common_rating(X,[],A+R,B+K)
  end.

common_rating_final([],_R2,J) ->J;
common_rating_final([X|X1],R2,J)->
  common_rating_final(X1,R2,J++[common_rating(X,R2)]).

更好地理解代码 common_rating函数需要一个{movie,rating}元组,并从另一个列表(B)中查找相同的电影和评级,然后返回{rating,rating_B}

现在common_rating_final递归遍历列表,让我们说A,并使用common_rating为A和B中常见的所有电影找到{rating_A,rating_B}

但是当我运行我的代码时

my_module:common_rating_final(L1,L2,[]).

它让我回头

[{2.5,3.0},{3.5,3.5},{3.0,1.5},{3.5,5.0},{2.5,3.5},{0,0}]

我可以过滤{0,0}部分,但我认为我的逻辑存在缺陷但无法编写代码,只返回没有{0,0}部分的常见评级。 请协助。

1 个答案:

答案 0 :(得分:7)

<强> TL; DR

[{X2, Y2} || {X1, X2} <- L1, {Y1, Y2} <- L2, X1 =:= Y1].

也许这里的“裂缝”可以找到更好(更高效等)的解决方案,但这个有效。基本上它模式匹配(“解构”)L并比较元组的第一个元素,如果第一个元素恰好相等则返回第二个元素。

全部的东西/证明:

gorre@uplink:~$ erl
Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]

Eshell V8.3  (abort with ^G)
1> L1= [{"Lady in the Water",2.5}, {"Snakes on a Plane",3.5}, {"Just My Luck",3.0}, {"Superman Returns",3.5}, {"You, Me and Dupree",2.5}, {"The Night Listener",3.0}].
[{"Lady in the Water",2.5},
 {"Snakes on a Plane",3.5},
 {"Just My Luck",3.0},
 {"Superman Returns",3.5},
 {"You, Me and Dupree",2.5},
 {"The Night Listener",3.0}]
2> L2 = [{"Lady in the Water",3.0}, {"Snakes on a Plane",3.5}, {"Just My Luck",1.5}, {"Superman Returns",5.0}, {"You, Me and Dupree",3.5}].
[{"Lady in the Water",3.0},
 {"Snakes on a Plane",3.5},
 {"Just My Luck",1.5},
 {"Superman Returns",5.0},
 {"You, Me and Dupree",3.5}]
3> [{X2, Y2} || {X1, X2} <- L1, {Y1, Y2} <- L2, X1 =:= Y1].
[{2.5,3.0},{3.5,3.5},{3.0,1.5},{3.5,5.0},{2.5,3.5}]
4>
  

请注意,我将原子更改为字符串(虽然它的工作方式相同)。