• lists 函数整理


    带函数的方法:
    %%%%%%%%%%%%%%%%%%%%%%%
    判断:
    all(Pred, List) -> boolean()
    如果List中的每个元素作为Pred函数的参数执行,结果都返回true,返回true,否则返回false
    any(Pred, List) -> boolean()
    如果List中至少有一个元素作为Pred函数的参数执行,结果返回true,返回true,否则返回false

    prefix(List1, List2) -> boolean()
    如果List1是List2的前缀(也就是说List1和List2前部分相同),那么返回true,否则返回false
    lists:prefix([a,b],[a,b,c]).
    true
    37,suffix(List1, List2) -> boolean()
    如果List1是List2的后缀,那么返回true,否则返回false
    例子
    lists:suffix("22","1122").
    结果
    true
    %%%%%%%%%%%%%%%%%%%%%%%
    排序:
    感觉不正常的函数:
    sort(Fun, List1) -> List2
    13> lists:sort(fun(A,B) ->false end, [1,2,3]).
    [3,2,1]
    14> lists:sort(fun(A,B) ->true end, [1,2,3]).
    [1,2,3]
    15>
    usort(Fun, List1) -> List2
    按照Fun函数进行排序,如果Fun返回true,那么只返回List1的第一个元素
    如果Fun返回false,那么List1从大到小排序
    例子1
    lists:usort(fun(A,B) -> true end, [1,2,2,3,4]).
    结果
    [1]
    例子2
    lists:usort(fun(A,B) -> false end, [1,2,2,3,4]).
    结果
    [4,3,2,2,1]
    19> lists:usort(fun(A,B) ->true end, [1,2,3,4,0]).
    [1]
    20> lists:usort(fun(A,B) ->false end, [1,2,3,4,0]).
    [0,4,3,2,1]
    21> lists:usort(fun(A,B) ->false end, [1,1,2,3]).
    [3,2,1,1]
    22> lists:usort(fun(A,B) ->false end, [1,1,2,3,-1,-2]).
    [-2,-1,3,2,1,1]
    23>

    32,sort(List1) -> List2
    将List1中的元素从小到大排序,然后返回新的一个列表。
    例子
    lists:sort([3,2,1]).
    结果
    [1,2,3]

    45,usort(List1) -> List2
    将List1按照从小到大的顺序排序,如果排序后有重复的元素,删除重复的,只保存一个唯一的。
    例子
    lists:usort([4,3,2,1,2,3,4]).
    结果
    [1,2,3,4]

    merge(Fun, List1, List2) -> List3
    9> lists:merge(fun(A, B) ->true end,[1,2], [11,12]).
    [1,2,11,12]
    10> lists:merge(fun(A, B) ->false end,[1,2], [11,12]).
    [11,12,1,2]
    18,umerge(Fun, List1, List2) -> List3
    这个函数和merge不同的是 当Fun返回true时,返回的List3中不能出现相同的元素
    疑问:但是当Fun返回false时,List3中可以有相同的元素。
    例子(Fun返回true的情况)
    lists:umerge(fun(A,B)-> true end,[1,2],[2,3]).
    结果
    [1,2,3]
    (Fun为false的情况)
    lists:umerge(fun(A,B)-> false end,[1,2],[2,3]).
    [2,3,1,2]

    ,merge(List1, List2) -> List3
    List1和List2分别是一个列表,这个函数的功能是将这两个列表合并成一个列表。
    lists:merge([[a,b,b],[c,[ddm,d],[g,[g]]]]).
    [a,b,b,c,[ddm,d],[g,[g]]]

    23, merge3(List1, List2, List3) -> List4
    将List1,List2,List3合并成一个列表
    例子
    lists:merge3([11],[22],[33,44]).
    结果:
    [11,22,33,44]

    41,umerge(ListOfLists) -> List1
    这个函数和merge唯一不同的就是,里面不能出现相同的元素,如果出现相同的,那么删除之,只保留一个唯一的
    例子
    lists:umerge([[1,2],[2,3]]).
    结果
    [1,2,3]
    分析:由于[[1,2],[2,3]]中merge后是[1,2,2,3],这个时候有两个相同的元素2,所以只保存一个2,所以结果是[1,2,3].

    42,umerge3(List1, List2, List3) -> List4
    将List1, List2, List3合并
    和merge3不同的是返回的List4中不能出现重复的元素
    例子
    lists:merge3([1,2],[2,3],[3,4]).
    结果
    [1,2,3,4]

    lists:map(fun(I) ->[I, I * I] end, [1,3,4,5]).
    [[1,1],[3,9],[4,16],[5,25]]
    3> lists:flatmap(fun(I) ->[I, I * I] end, [1,3,4,5]).
    [1,1,3,9,4,16,5,25]
    foldl(Fun, Acc0, List) -> Acc1
    foldr(Fun, Acc0, List) -> Acc1
    foreach(Fun, List) -> ok
    以List中的每个元素为参数执行Fun函数,执行顺序按照List中元素的顺序,这个函数最后返回ok。
    lists:foreach(fun(I) -> I + 10 end, [1,3,4,5]).
    ok

    20,zipwith(Combine, List1, List2) -> List3
    将List1和list2中的每个元素执行Combine函数,然后返回一个元素,List3就是由Combine函数返回的一个个元素组成的。
    lists:zipwith(fun(X, Y) -> X+Y end, [1,2,3], [4,5,6]).
    [5,7,9]
    27> lists:zipwith3(fun(A, B,C) -> A + B + C end, [1,2,3], [11,22,33],[21,22,23]).
    "!.;"
    28> lists:zipwith3(fun(A, B,C) -> A + B + C end, [100,200,300], [11,22,33],[21,22,23]).
    [132,244,356]
    29>
    map(Fun, List1) -> List2
    将List1中的每个元素去在Fun中执行,然后返回一个元素,最后返回的这些元素组成一个列表,
    返回给List2
    flatmap(Fun, List1) -> List2
    这个函数和map比较类似,相当于执行了
    mapfoldr(Fun, Acc0, List1) -> {List2, Acc1}
    11,mapfoldl(Fun, Acc0, List1) -> {List2, Acc1}
    这个函数等于是把map和foldl函数结合起来 ,返回两个结果
    lists:mapfoldl(fun(I, Sum) ->{10 * I, Sum + I} end, 0, [1,2,3]).
    {[10,20,30],6}
    %%%%%%%%%%%%%%%%%%%%%%%%%%%
    关于tuple 的操作:
    keymap(Fun, N, TupleList1) -> TupleList2
    对TupleList1中的每个元素的第N项作为参数在Fun中处理,然后这个第N项最后就被替换为Fun执行完返回的值
    lists:keymap(fun(V) -> V * 10 end, 3, [{a,b,1},{c,d,2}]).
    [{a,b,10},{c,d,20}]

    9,keydelete(Key, N, TupleList1) -> TupleList2
    这个函数适合处理列表里面的元素是元组的情况
    删除TupleList1中元素第N个元素和Key一致的元素,只删除第一个一样的,后面一样的不删除
    例子:
    List = [{name,"zhangjing"},{sex,"male"},{name,"zhangsan"},{sex,"male"}],
    lists:keydelete("male",2,List)
    结果:
    [{name,"zhangjing"},{name,"zhangsan"},{sex,"male"}]

    注意返回值
    10,keyfind(Key, N, TupleList) -> Tuple | false
    查找TupleList中的一个Tuple,如果查找到,返回,如果没有查找到,则返回false
    这个Tuple必须满足第N个元素和key是一样。
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"}].
    lists:keyfind("zhangjing",2,List1)
    结果:{name,"zhangjing"}
    14,keysearch(Key, N, TupleList) -> {value, Tuple} | false
    这个函数和keyfind差不多,就是返回值的结构不一样
    也是在TupleList中找一个Tuple,这个Tuple的第N个元素和Key一样。
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"}]
    lists:keysearch("zhangjing",2,List1).
    结果:
    {value,{name,"zhangjing"}}
    eg:
    lists:keysearch("zhangjing",2,[{name,"zhangjing"},{name,"zhangsan"}]).
    {value,{name,"zhangjing"}}
    34> lists:keysearch("zhangjin",2,[{name,"zhangjing"},{name,"zhangsan"}]).
    false
    35> lists:keyfind("zhangjin",2,[{name,"zhangjing"},{name,"zhangsan"}]).
    false
    36> lists:keyfind("zhangjing",2,[{name,"zhangjing"},{name,"zhangsan"}]).
    {name,"zhangjing"}

    11,keymember(Key, N, TupleList) -> boolean()
    如果TupleList中的元素中存在第N个元素和key一致,则返回true,否则返回false
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"}].
    lists:keymember("zhangjing",2,List1).
    结果:true

    12,keymerge(N, TupleList1, TupleList2) -> TupleList3
    将TupleList1和TupleList2进行混合,组成一个TupleList,
    新组成的TupleList是按照Tuple的第N个元素进行排序的
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"}].
    List2 = [{nick,"zj"},{nick,"zs"}].
    lists:keymerge(2,List1,List2).
    结果:
    [{name,"zhangjing"},
    {name,"zhangsan"},
    {nick,"zj"},
    {nick,"zs"}]

    13,keyreplace(Key, N, TupleList1, NewTuple) -> TupleList2
    在TupleList1的Tuple中找出第N个元素和Key一致,然后用NewTuple将这个Tuple替换掉,如果没有找到
    ,则返回原来的TupleList1
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"}]
    lists:keyreplace("zhangjing",2,List1,{nickname,"netzj"}).
    结果:
    [{nickname,"netzj"},{name,"zhangsan"}]

    16,keystore(Key, N, TupleList1, NewTuple) -> TupleList2
    这个函数和keyreplace函数比较像,不同的是,这个keystore在没有找到对应的Tuple时,
    会将这个NewTuple追加在这个TupleList1的最后。
    例子:
    List1 = [{name,"zhangsan"},{name,"zhangjing"}].
    找到了的情况
    lists:keystore("zhangjing",2,List1,{name,"netzhangjing"}).
    [{name,"netzhangjing"},{name,"zhangsan"}]
    没有找到的情况
    lists:keystore("zhanging",2,List1,{name,"netzhangjing"}).
    [{name,"zhangjing"},{name,"zhangsan"},{name,"netzhangjing"}]

    17,keytake(Key, N, TupleList1) -> {value, Tuple, TupleList2} | false
    在TupleList1中找Tuple,这个Tuple的第N个元素和Key一致,如果找到了这么一个Tuple
    那么返回,{value, Tuple, TupleList2} 其中TupleList2是去掉Tuple的TupleList1.
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"},{name,"lisi"}].
    lists:keytake("zhangjing",2,List1).
    结果:
    {value,{name,"zhangjing"},[{name,"zhangsan"},{name,"lisi"}]}

    15,keysort(N, TupleList1) -> TupleList2
    对TupleList1中的Tuple按照第N个元素进行排序,然后返回一个新的顺序的TupleList。
    不过这种排序是固定的。
    例子:
    List1 = [{name,"zhangsan"},{name,"zhangjing"}].
    lists:keysort(2,List1).
    结果:
    [{name,"zhangjing"},{name,"zhangsan"}]

    39,ukeymerge(N, TupleList1, TupleList2) -> TupleList3
    TupleList1和TupleList2里面的元素都是元组
    将TupleList1和TupleList2合并,合并的规则是按照元组的第N个元素,如果第N个元素有相同的,那么保留TupleList1中
    的,删除TupleList2中的。

    43,unzip(List1) -> {List2, List3}
    List1里面的元素是元组,每个元组由两个元素组成,返回值List2包含每个List1中每个元组的第一个元素
    返回值List3包含每个List1中每个元组的第二个元素。
    例子
    lists:unzip([{name,"zhangsan"},{sex,"male"},{city,"hangzhou"}]).
    结果
    {[name,sex,city],["zhangsan","male","hangzhou"]}

    44,unzip3(List1) -> {List2, List3, List4}
    List1里面的元素是元组,每个元组由三个元素组成,返回值List2包含每个List1中每个元组的第一个元素;
    返回值List3包含每个List1中每个元组的第二个元素;返回值List4包含每个List1中每个元组的第三个元素。
    例子
    lists:unzip3([{name,"zhangsan","apple"},{sex,"male","banana"},{city,"hangzhou","orange"}]).
    结果
    {[name,sex,city],
    ["zhangsan","male","hangzhou"],
    ["apple","banana","orange"]}
    注意,最终返回的是一个元组。

    46,zip(List1, List2) -> List3
    将两个长度相同的列表合并成一个列表
    List3是里面的每一个元组的第一个元素是从List1获取的,而每个元组的第二个元素是从List2中获取的
    例子
    lists:zip([name,sex,city],["zhangsan","male","hangzhou"]).
    结果
    [{name,"zhangsan"},{sex,"male"},{city,"hangzhou"}]
    注意,如果List1和List2长度不一致,那么这个函数将会报错。

    47,zip3(List1, List2, List3) -> List4
    将三个长度相同的列表合并成一个列表
    List4是里面的每一个元组的第一个元素是从List1获取的,而每个元组的第二个元素是从List2中获取的
    每个元组的第三个元素是从List3中获取的。
    例子
    lists:zip3([name,sex,city],["zhangsan","male","hangzhou"],["nick","1","zhejiang"]).
    结果
    [{name,"zhangsan","nick"},
    {sex,"male","1"},
    {city,"hangzhou","zhejiang"}]

    %%%%%%%%%%%%%%%%%%%%%%%%%
    不带函数的方法
    flatlength(DeepList) -> integer() >= 0
    我的理解是DeepList就是列表里面套列表
    计算列表的长度,即用flatten函数将DeepList转化成List后元素的个数
    这个函数和length()的区别就是:
    length函数是得到列表元素的个数,
    而flatlength函数是先将DeepList转化成List后的个数
    譬如说List = [1,2,[3,4]]这个列表用
    length(List)求的值是:3
    lists:flatlength(List)求的值是:4
    其实lists:flatlength(List) = length(flatten(List))
    1,append(ListOfLists) -> List1
    ListOfLists都是由List组成的,而List一个列表,里面可以是任何类型的元素
    这个函数就是将ListOfLists里面的所有列表的元素按顺序编成一个列表
    提示:ListOfLists里面的元素必须都是列表才能用这个函数
    例子
    lists:append([[1, 2, 3], [a, b], [4, 5, 6]]).
    结果:
    [1,2,3,a,b,4,5,6]

    7,flatten(DeepList) -> List
    将DeepList变成只有term()的list
    例子:
    lists:flatten([[a,a],[b,b],[c,c]]).
    结果:
    [a,a,b,b,c,c]
    注意二者是有区别的:
    lists:append([[a,b],[c,[d,[e,f]]],[t]]).
    [a,b,c,[d,[e,f]],t]
    31> lists:flatten([[a,b],[c,[d,[e,f]]],[t]]).
    [a,b,c,d,e,f,t]
    8,flatten(DeepList, Tail) -> List
    就是将DeepList变成只有term的List后,在后面再加一个Tail。
    例子:
    lists:flatten([[a,a],[b,b],[c,c]],[dd]).
    结果:
    [a,a,b,b,c,c,dd]

    28,reverse(List1) -> List2
    将List1反转
    例子
    lists:reverse([1,2,3,4]).
    结果
    [4,3,2,1]

    29,reverse(List1, Tail) -> List2
    将List1反转,然后将Tail接在反转List1的后面,然后返回
    例子
    lists:reverse([1, 2, 3, 4], [a, b, c]).
    [4,3,2,1,a,b,c]

    4,delete(Elem, List1) -> List2
    List1是由很多Element组成的,这个函数的功能是在List1中寻找第一个和Elem元素一样的,
    然后删除之,返回删除后新的列表。
    例子
    lists:delete({name,"zhangsan"},[{name,"lisi"},{name,"zhangsan"},{name,"wangmazi"})).
    结果
    [{name,"lisi"},{name,"wangmazi"}]

    5,duplicate(N, Elem) -> List
    返回一个由N个Elem组成的列表。
    例子
    lists:duplicate(5,"test").
    结果
    ["test","test","test","test","test"]

    %%%%%%%%%%%%%%%%%%
    合并:
    2,append(List1, List2) -> List3
    将List1和List2两个列表连接起来,组成一个列表,然后返回新的这个列表
    这个函数的功能等同于List1 ++ List2
    例子
    lists:append("abc", "def").
    结果
    "abcdef"

    3,concat(Things) -> string()
    这里的Things是一个列表,里面由atom() | integer() | float() | string()
    将这个列表里面的元素拼成一个字符串,然后返回
    例子
    lists:concat([doc, '/', file, '.', 3]).
    结果
    doc/file.3"
    %%%%%%%%%%%%%%%%%%%%%%%

    拆分:
    34,sublist(List1, Len) -> List2
    返回从第一个元素到第Len个元素的列表,这个Len大于List1的长度时,返回全部。
    例子
    lists:sublist([1,2,3,4,5,6],3).
    结果
    [1,2,3]

    35,sublist(List1, Start, Len) -> List2
    返回从List1的第Start个位置开始,后面Len个元素的列表。
    例子
    lists:sublist([1,2,3,4], 2, 2).
    结果
    [2,3]

    6,subtract(List1, List2) -> List3
    等同于 List1 -- List2
    这个函数功能是返回一个List1的副本,对于List2中的每个元素,第一次在List1副本中出现时被删掉。
    例子
    lists:subtract("112233","12").
    结果
    "1233"
    lists:subtract("abc","ab").
    "c"

    注意区别:
    partition(Pred, List) -> {Satisfying, NotSatisfying}
    注:返回的是元组形式的两个数组,遍历全部元素
    lists:partition(fun(I) -> I rem 2 == 1 end, [1,2,3,4] ).
    {[1,3],[2,4]}

    splitwith(Pred, List) -> {List1, List2}
    将List分成List1和List2,
    List1由List中元素在Pred函数返回true的组成,但是有一点,如果遇到为false的,则将剩下的元素
    全部放到List2中,List1中就只有前面为true的。
    lists:splitwith(fun(A) ->is_atom(A) end, [a,b,1,c,3]).
    {[a,b],[1,c,3]}

    takewhile(Pred, List1) -> List2
    List1中的元素element依次执行Pred(element),如果返回true,则获取这个元素,直到有元素执行Pred(element)返回false
    lists:takewhile(fun(A) ->is_atom(A) end, [a,b,1,c,3]).
    [a,b]
    33,split(N, List1) -> {List2, List3}
    将List1分成List2和List3
    其中List2包括List1的前N个元素,List3包含剩余的。
    例子
    lists:split(3,[1,2,3,4,5]).
    结果
    {[1,2,3],[4,5]}

    %%%%%%%%%%%%%%%%%%%%%%%
    math:

    26,nthtail(N, List) -> Tail
    返回List列表中第N个元素后面的元素
    例子
    lists:nthtail(3, [a, b, c, d, e]).
    结果
    [d,e]

    25,nth(N, List) -> Elem
    返回List中的第N个元素。
    例子
    lists:nth(2,[{name,"zhangsan"},{name,"lisi"},{name,"wangmazi"}]).
    结果
    {name,"lisi"}

    18,last(List) -> Last
    返回:List最后一个元素
    例子:
    List1 = [{name,"zhangjing"},{name,"zhangsan"},{name,"lisi"}].
    lists:last(List1).
    结果:
    {name,"lisi"}

    20,member(Elem, List) -> boolean()
    如果Elem和List中的某个元素匹配(相同),那么返回true,否则返回false
    例子
    lists:member({sex,"1"},[{sex,"1"},{sex,"2"},{sex,"3"}]).
    结果:
    true

    19,max(List) -> Max
    取出List中最大的元素,一般List是整型时比较适合。
    例子:
    lists:max([1,10,15,6]).
    结果:
    15

    24,min(List) -> Min
    返回List中的最小的元素,和max函数对应
    例子
    lists:min([1,2,3]).
    结果
    1

    38,sum(List) -> number()
    返回List中每个元素的和。其中List中的元素都应该是number()类型的。
    例子
    lists:sum([1,2,3,4]).
    结果
    10

    30,seq(From, To) -> Seq
    其中From和To都是整型,这个函数返回一个从From到To的一个整型列表。
    例子
    lists:seq(1,10).
    结果
    [1,2,3,4,5,6,7,8,9,10]

    31,seq(From, To, Incr) -> Seq
    返回一个整型列表,这个列表的后一个元素比前一个元素大Incr。
    例子
    lists:seq(1,10,4).
    [1,5,9]

    整理时参考了:
    http://blog.csdn.net/zhangjingyangguang/article/details/7377787

  • 相关阅读:
    Reusable action with query database
    Oracle实现分组统计记录
    Oracle行列转换的几种实现方法
    junit私有方法测试
    Junit实现抽象类测试(二)
    C++的性能C#的产能?! .Net Native 系列《二》:.NET Native开发流程详解
    C++的性能C#的产能?! .Net Native 系列向导
    c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥
    辞职敬礼
    WPF 心路历程
  • 原文地址:https://www.cnblogs.com/ShankYan/p/4152363.html
Copyright © 2020-2023  润新知