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

<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的各种处理,包括各种复杂的元素结构,例如元祖组成的列表等

分享到:
评论

相关推荐

    实验室管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    实验室管理系统 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

    基于java的苹果网吧计费管理系统设计与实现.docx

    基于java的苹果网吧计费管理系统设计与实现.docx

    纸中世界-跳跃游戏.sb3

    纸中世界-跳跃游戏.sb3

    Keysight 网络分析仪新建校准件操作指导

    本操作指导用于在 ENA 系列网络分析仪 E5080B 上自定义校准件。目前 Keysight 网络分析仪的 PNA 系列 N52xxB、P50xx 系列、P937x 系列、PXI 板卡式网分以及 ENA 系列的 E5080B、E5081B 的操作界面均统一到如下界面,操作方式相同。

    调查海域浮游动物各类群栖息密度的空间分布表格.docx

    调查海域浮游动物各类群栖息密度的空间分布表格.docx

    ssm框架Java项目源码-高校毕业生就业管理系统+jsp毕设-大作业.zip

    本项目“高校毕业生就业管理系统”是一套基于SSM框架(Spring+SpringMVC+MyBatis)精心开发的Java Web应用,旨在为高校毕业生、高校就业指导部门以及企业用户提供一个高效、便捷的就业信息管理平台。 系统主要功能包括:学生用户可以查看和发布个人简历,搜索并筛选合适的工作岗位,申请心仪的职位;企业用户可以发布招聘信息,筛选和查看应聘者的简历,进行面试邀请等操作;高校就业指导部门则可以对学生的就业情况进行统计和分析,以更好地提供就业指导服务。 此外,系统采用了B/S架构,用户只需通过浏览器即可访问,无需安装客户端软件,方便快捷。数据库设计合理,数据存储安全,系统性能稳定。 本项目的开发,不仅为计算机相关专业的学生提供了一个实践SSM框架的好机会,帮助他们更好地理解和掌握Java Web开发技术,还能有效提升高校毕业生的就业效率和质量。

    使用 Python 进行视频编辑.zip

    电影剪辑 笔记MoviePy 最近升级到 v2.0,引入了重大的重大变化。有关如何更新 v2.0 代码的更多信息,请参阅本指南。MoviePy(在线文档在此处)是一个用于视频编辑的 Python 库剪切、连接、插入标题、视频合成(又名非线性编辑)、视频处理和创建自定义效果。MoviePy 可以读取和写入所有最常见的音频和视频格式,包括 GIF,并且可以在 Windows/Mac/Linux 上运行,并搭载 Python 3.9+。例子在此示例中,我们打开一个视频文件,选择 10 到 20 秒之间的子剪辑,在屏幕中心添加标题,然后将结果写入新文件# Import everything needed to edit video clipsfrom moviepy import *# Load file example.mp4 and keep only the subclip from 00:00:10 to 00:00:20clip = VideoFileClip("long_examples/example2.mp4").with_subcl

    基于java的视频播放器系统设计与实现.docx

    基于java的视频播放器系统设计与实现.docx

    基于java的车辆出租管理系统设计与实现.docx

    基于java的车辆出租管理系统设计与实现.docx

    mqtt等协议的pcap文件

    mqtt等协议的pcap文件

    小白的Python入门教程部分章节源码.zip

    学习python

    修木工施工规范及流程.docx

    修木工施工规范及流程.docx

    适用于 Windows,Linux 和 Python 3 (3.5,3.6,3.7) 的 Tensorflow Faster R-CNN.zip

    适用于 Windows/Linux 和 Python 3 (3.5/3.6/3.7) 的 Tensorflow Faster R-CNNtf-faster-rcnn使用 Python 3 在 Windows 和 Linux 上使用 Tensorflow Faster R-CNN这是在 Windows 和 Linux 上编译 Faster R-CNN 的分支。它深受这里和这里的出色工作的启发。目前,此存储库支持 Python 3.5、3.6 和 3.7。感谢@morpheusthewhite请注意我没有时间或意图修复此分支的所有问题,因为我不将其用于商业用途。我创建此分支只是为了好玩。如果您想做出任何承诺,我们非常欢迎。Tensorflow 已经发布了一个对象检测 API。请参考它。https: //github.com/tensorflow/models/tree/master/research/object_detection如何使用此分支安装 tensorflow,最好是 GPU 版本。按照说明操作。如果没有安装 GPU 版本,则需要注释掉代码中的所有 GP

    章节2:编程基本概念之python程序的构成

    Python是一种高级、解释型、面向对象的编程语言,以其简洁的语法、强大的功能和广泛的应用领域而著称。它无需事先编译,代码在运行时逐行解释执行,提供了极大的灵活性和快速开发的能力。Python支持多种数据类型,包括整数、浮点数、字符串、布尔值、列表、元组、字典和集合等,以及丰富的操作符和流程控制结构,使得开发者可以编写出复杂且灵活的代码。 Python拥有一个广泛的标准库,涵盖了文件操作、网络通信、文本处理、正则表达式、数学运算等多个领域,为开发者提供了大量的模块和函数。此外,Python还拥有丰富的第三方库,如NumPy、Pandas、Matplotlib等用于数据分析和可视化的库,以及Django、Flask等用于Web开发的框架,这些库和框架进一步扩展了Python的应用领域和功能。 Python在Web开发、数据科学、人工智能、自动化运维和游戏开发等多个领域都有广泛的应用。在Web开发方面,Python提供了Django和Flask等强大的Web框架,使得开发者可以轻松地开发出各种Web应用和网站。在数据科学领域,Python是数据科学家的首选工具,其强大的数据处理能力和丰

    毕设源码-基于python的西西家居全屋定制系统的设计与实现_ijsj--论文-期末大作业+说明文档.rar

    本项目是基于Python语言开发的西西家居全屋定制系统,旨在为家居行业提供一个高效、智能的定制解决方案。项目涵盖了从客户需求分析、设计方案生成、材料选购到最终订单生成的全过程,力求实现家居定制的数字化和智能化。 在主要功能方面,系统具备强大的客户管理模块,能够详细记录和分析客户的定制需求。设计模块则采用先进的三维建模技术,为客户提供直观、真实的家居设计方案预览。此外,系统还整合了丰富的材料数据库,方便客户根据自身喜好和预算进行材料选择。 框架方面,项目采用了B/S架构,确保了系统的稳定性和可扩展性。后端使用Python的Django框架,前端则结合了HTML、CSS和JavaScript等技术,实现了用户界面的友好和响应速度。 开发此项目的目的,不仅是为了满足家居行业对个性化定制的需求,也为计算机相关专业的学生提供了一个实践和学习的平台,有助于提升他们的实际开发能力。

    简单连接到 Binance Public API.zip

    Binance公共API连接器Python 这是一个轻量级库,可作为Binance 公共 API的连接器支持的 API/api/*/sapi/*现货 Websocket 市场动态现货用户数据流现货 WebSocket API包含测试用例和示例可定制的基本 URL、请求超时和 HTTP 代理可以显示响应元数据安装pip install binance-connector文档https://binance-connector.readthedocs.ioRESTful API使用示例from binance.spot import Spotclient = Spot()# Get server timestampprint(client.time())# Get klines of BTCUSDT at 1m intervalprint(client.klines("BTCUSDT", "1m"))# Get last 10 klines of BNBUSDT at 1h intervalprint(client.k

    离线安装eclipse的aptana插件详细中文最新版本

    Aptana是一个非常强大,开源,JavaScript-focused的AJAX开发IDE。 Aptana的特点包括: 1JavaScript,HTML,CSS语言的Code Assist功能。 2Outliner(大纲):显示JavaScript,HTML和CSS的代码结构。

    学习自律养成小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程.zip

    学习自律养成小程序 微信小程序+SSM毕业设计 源码+数据库+论文+启动教程 项目启动教程:https://www.bilibili.com/video/BV1BfB2YYEnS

    认知能力评估表.docx

    认知能力评估表.docx

    数学建模学习资料 粒子群算法 先进算法讲义.pdf

    数学建模学习资料 粒子群算法 先进算法讲义.pdf

Global site tag (gtag.js) - Google Analytics