`
ZacMa
  • 浏览: 39315 次
  • 来自: 深圳
社区版块
存档分类
最新评论

<15> lists模块补充

阅读更多
%% 对list模块经常用到的进行补充
%% 1 对所有元素进行去重
%% (1) lists:umerge
%% (2)

ldrop_dup(List) ->
Fun = fun(X, List1) ->
IsMem = lists:member(X, List1),
if IsMem == true ->
List1;
true ->
[X|List1]
end
end,
RetList = lists:foldl(Fun, [], List),
lists:reverse(RetList).


%% 去掉某个元素
ldrop_ele(Ele, List) ->
erlang:display([?MODULE, ?LINE, Ele, List]),
Fun = fun(X, List1) ->
if X == Ele ->
List1;
true ->
[X|List1]
end
end,
RetList = lists:foldl(Fun, [], List),
lists:reverse(RetList).


%% 对某个元素进行去重, 留下第一个,其他的都删除
%% 如果只有一个就删除
ldrop_one_dup(Ele, List) ->
Ret = ldrop_one_dup_i(Ele, List, 0, []),
Ret.

ldrop_one_dup_i(Ele, [], Count, RetList) ->
RList = lists:reverse(RetList),
if Count == 1 ->
ldrop_ele(Ele, RList);
true ->
RList
end;

ldrop_one_dup_i(Ele, [H|T], Count, RetList) ->
if H == Ele andalso Count == 0 ->
ldrop_one_dup_i(Ele, T, 1, [H|RetList]);
H == Ele andalso Count == 1 ->
ldrop_one_dup_i(Ele, T, 2, RetList);
H == Ele andalso Count > 1 ->
ldrop_one_dup_i(Ele, T, Count, RetList);
true ->
ldrop_one_dup_i(Ele, T, Count, [H|RetList])
end.

%% 对某个子列表的元素进行去重, 去重List1的
ldrop_list_dup([], List2) ->
List2;
ldrop_list_dup(List1, List2) ->
[H|T] = List1,
NewList = ldrop_one_dup(H, List2),
ldrop_list_dup(T, NewList).

%% 对某个子列表的元素完全去掉,去掉list1的
ldrop_list([], List2) ->
List2;
ldrop_list(List1, List2) ->
[H|T] = List1,
NewList = ldrop_ele(H, List2),
ldrop_list(T, NewList).

%% 替换,把列表的首次遇到的某个值,替换为另一个值, 把Ele1替换为Ele2
%% 如果不存在,返回原来的值

lrep_one(Ele1,Ele2, List) ->
lrep_one1(Ele1, Ele2, false, List, []).
lrep_one1(_Ele1, _Ele2, Flag, [], List) ->
if Flag ->
List;
true ->
lists:reverse(List)
end;

lrep_one1(Ele1, Ele2, Flag, List1, List2) ->
[H1|T1] = List1,
if H1 == Ele1 ->
NewList2 = [Ele2|List2],
if is_atom(T1) ->
RList = [T1|NewList2],
lists:reverse(RList);
true ->
%RList1 = lists:reverse(NewList2),
%RList = lists:merge([RList1, T1])
RList1 = lists:reverse(T1),
RList2 = lists:merge(RList1, NewList2),
RList = lists:reverse(RList2),
lrep_one1(Ele1, Ele2, true, [], RList)
end;
true ->
lrep_one1(Ele1, Ele2, Flag, T1, [H1|List2])
end.


%% 替换,把列表的某个值,完全替换为另一个值, 把Ele1替换为Ele2
lrep_all(Ele1, Ele2, List) ->
Fun = fun(X, List1) ->
if X == Ele1 ->
[Ele2 | List1];
true ->
[X|List1]
end
end,
RetList = lists:foldl(Fun, [], List),
lists:reverse(RetList).



lists.erl 模块注意事项:
(1) 
append/1: 实现中用到 ++
append([E]) -> E;
append([H|T]) -> H ++ append(T);
append([]) -> [].

(2)
delete/2 实现用递归,却非尾递归
delete(Item, [Item|Rest]) -> Rest;
delete(Item, [H|Rest]) ->
    [H|delete(Item, Rest)];
delete(_, []) -> [].

(3)
dropwhile/2
dropwhile(Pred, [Hd|Tail]=Rest) ->
    case Pred(Hd) of
    true -> dropwhile(Pred, Tail);
    false -> Rest
    end;
dropwhile(Pred, []) when is_function(Pred, 1) -> [].
删除函数返回true的元素,如果遇到返回false立即返回剩余的列表,不管以后是否能有返回true的元素

(4)
duplicate/2
duplicate(N, X) when is_integer(N), N >= 0 -> duplicate(N, X, []).

duplicate(0, _, L) -> L;
duplicate(N, X, L) -> duplicate(N-1, X, [X|L]).
如果不要is_integer的guard语句,当传入参数N非整形,返回bad argument in an arithmetic expression, 否则返回
no function clause matching lists:duplicate

(5)
lists里面的bif

%% Bifs: member/2, reverse/2
%% Bifs: keymember/3, keysearch/3, keyfind/3

(6)
suffix/2
suffix(List1, List2)
List1如果是List2的子列表,结尾子列表,则为true,否则false

(7)
不少的对元祖组成的列表处理,
keydelete
keyfind
keymap
keymember
keymerge
keyreplace
...

lists主要是对list的各种处理,包括各种复杂的元素结构,例如元祖组成的列表等

分享到:
评论

相关推荐

    Python标准库itertools的使用方法

    如果还不能满足你的要求,欢迎加入补充。 使用Python标准库itertools只需简单一句导入:import itertools chain() 与其名称意义一样,给它一个列表如 lists/tuples/iterables,链接在一起;返回iterables对象。 ...

    netfilter-hacking-HOWTO

    - **联系方式**:netfilter@lists.samba.org - **版本**:v0.0.1 (1999年8月31日) 4. **为何会出现崩溃问题?** - 崩溃通常与错误的编程实践或对netfilter架构理解不足有关。深入学习netfilter的工作原理可以...

    详解python itertools功能

     itertools是python内置的模块,使用简单且功能强大,这里尝试汇总整理下,并提供简单应用示例;如果还不能满足你的要求,欢迎加入补充。  使用只需简单一句导入:import itertools chain()  与其名称意义一样,...

    FullSpeed-Python-英文版.pdf

    2. **列表(Lists)**: 列表是Python中重要的数据结构,用于存储有序的元素集合。这部分会讲解如何创建、修改和操作列表,包括切片、索引、排序、列表推导式等。 3. **数字和字符串(Numbers and strings)**: 数字和...

    Python中使用filter过滤列表的一个小技巧分享

    假设我们导入了一个模块`random`,并希望获取其中所有不以下划线`_`开头的方法名称: ```python import random methods = filter(lambda s: not s.startswith("_"), dir(random)) print(list(methods)) ``` **解释...

    pef-utils-1.2.0.zip

    项目还包含一系列实用工具类,如`Iterate`、`Collectors`和`Lists`,它们提供了大量的静态方法,用于处理常见的集合操作,如查找、过滤、转换等。 6. **代码示例**: 在源码中,通常会包含丰富的单元测试和示例...

    ATM原理 ATM网络

    2.4 路由选择过程和指定转移表(DTL:Designated Transit Lists) 84 第三章 IMA协议 86 3.1 IMA概述 86 3.2 初步实现方案 87 第四章 ILMI协议 89 4.1 背景 89 4.2 ILMI协议实现 90 4.3 补充说明 94 第五章 ...

    ITSM中文术语标准_itSMF and SinoServiceONE

    ##### 15. Alert (告警) 当监控系统检测到某些异常情况时触发的通知机制,以便及时采取应对措施。 ##### 16. Alert Phase (告警阶段) 在事件管理中,系统或服务出现异常后,自动触发的初步响应阶段。 ##### 17. ...

Global site tag (gtag.js) - Google Analytics