天天看点

erlang lists模块函数使用大全(copy)

一,带函数pred

1, all(pred, list) ->

boolean()

如果list中的每个元素作为pred函数的参数执行,结果都返回true,那么all函数返回true,

否则返回false

例子:

lists:all(fun(e) -> true

end,[1,2,3,4]).

结果

true

2, any(pred, list) ->

如果list中至少有一个元素作为pred函数的参数执行,结果返回true,那么any函数返回true,

例子

lists:any(fun(e) -> is_integer(e)

end,[q,2,a,4]).

3,dropwhile(pred, list1)

-> list2

将list1列表中的元素作为参数执行pred函数,如果返回true,将其丢弃,最后返回剩余元素

组成的列表

lists:dropwhile(fun(e) -> is_atom(e)

end,[a,1,2,a,b]).

[1,2,a,b]

4,filter(pred, list1) ->

list2

返回一个列表,这个列表是由list1中执行pred函数返回true的元素组成。

lists:filter(fun(e) ->

is_integer(e) end,[q,2,a,4]).

结果:

[2,4]

5,map(fun, list1) ->

将list1中的每个元素去在fun中执行,然后返回一个元素,最后返回的这些元素组成一个列表,

返回给list2

lists:map(fun(x)->[x,x] end,

[a,b,c]).

结果:[[a,a],[b,b],[c,c]]

6,flatmap(fun, list1) ->

这个函数和map比较类似,相当于执行了

lists:append(lists:map(list1)).

也就是把map的结果进行append处理

lists:flatmap(fun(x)->[x,x]

end, [a,b,c]).

结果:[a,a,b,b,c,c]

7,foldl(fun, acc0, list) ->

acc1

fun这个函数有两个参数

第一个参数是list中的元素,第二个参数是fun函数执行完后的返回值,这个参数第一次执行时就是acc0

例子:对[1,2,3,4,5]求和

lists:foldl(fun(x,

sum) -> x + sum end, 0,

[1,2,3,4,5]).

结果:15

执行过程:首先,fun第一次执行时,x的值取列表list的第一个元素1,sum取0,fun第二次执行时,x的值取列表list的第二个元素2,sum取fun第一次的返回值依次轮推,直到list中每个元素执行完,最后foldl返回最后一次的结果。

8,foldr(fun,

acc0, list) -> acc1

foldr这个函数和foldl比较相似

不过是fun执行时,x的值先取list的最后一个,然后取倒数第二个。

9,foreach(fun, list)

-> ok

以list中的每个元素为参数执行fun函数,执行顺序按照list中元素的顺序,这个函数最后返回ok。是单边的

lists:foreach(fun(x)->

  %%using x to do somethings

%%

  end,list)

10,keymap(fun, n, tuplelist1)

->

tuplelist2

对tuplelist1中的每个元素的第n项作为参数在fun中处理,然后这个第n项最后就被替换为fun执行完返回的值

list1 = [{name,"zhangjing"},{name,"zhangsan"}].

lists:keymap(fun(x)->

  list_to_atom(x)

end,2,list1).

[{name,zhangjing},{name,zhangsan}]

11,mapfoldl(fun, acc0, list1) -> {list2,

acc1}

这个函数等于是把map和foldl函数结合起来。将list1中的每一个元素执行fun函数,执行后花括号的第一个值作为返回值返回,

第二个值作为参数传给fun,作为下一次用。

lists:mapfoldl(fun(x, sum) -> {2*x, x+sum}

end,

0, [1,2,3,4,5]).

{[2,4,6,8,10],15}

12,mapfoldr(fun, acc0, list1) -> {list2,

这个函数相当于将map和foldr结合起来

13,merge(fun, list1, list2) ->

list3

这个函数的功能也是把list1和list2合并到一起,只不过是list1和list2的元素要作为参数在fun中执行,如果

fun返回true,那么返回值就是list1在前,list2在后。否则,反之。

lists:merge(fun(a,b)-> false end,

[3,4],[2,1]).

[2,1,3,4]

14,partition(pred, list)

-> {satisfying,

notsatisfying}

这个函数的功能是将list分成两个list1和list2,list1是将list元素作为参数去pred函数中执行返回true的元素组成,

list2由pred返回false的元素组成。

注意,返回的是一个元组

lists:partition(fun(a) -> a rem 2 == 1 end,

[1,2,3,4,5,6,7]).

{[1,3,5,7],[2,4,6]}

15,sort(fun, list1)

如果fun函数返回true,则排序是从小到大的顺序,否则,从大到小。

其中fun有两个参数。

lists:sort(fun(a,b)-> false end,[1,2,3]).

[3,2,1]

16,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,d,2,3,4,e]).

{[a,b],[1,c,d,2,3,4,e]}

17,takewhile(pred, list1) -> list2

list1中的元素element依次执行pred(element),如果返回true,则获取这个元素,直到有元素执行pred(element)返回false

lists:takewhile(fun(e)->

is_atom(e) end,[a,b,1,e,{c},[d]]).

[a,b]

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]

好神奇,竟然2有重复

19,usort(fun, list1) ->

按照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,

[4,3,2,2,1]

20,zipwith(combine, list1, list2)

将list1和list2中的每个元素执行combine函数,然后返回一个元素,list3就是由combine函数返回的一个个元素组成的。

功能和map有点像,但是这里是对两个列表的操作。

lists:zipwith(fun(x, y) -> x+y end,

[1,2,3], [4,5,6]).

[5,7,9]

21,zipwith3(combine,

list1, list2, list3) ->

list4

将list1和list2,list3中的每个元素执行combine函数,然后返回一个元素,list4就是由combine函数返回的一个个元素组成的。

功能和map有点像,但是这里是对三个列表的操作。

lists:zipwith3(fun(x, y, z) -> x+y+z end,

[1,2,3], [4,5,6],[7,8,9]).

[12,15,18]

二,不带函数pred

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]

2,append(list1,

list2) -> list3

将list1和list2两个列表连接起来,组成一个列表,然后返回新的这个列表

这个函数的功能等同于list1

++ list2

lists:append("abc",

"def").

"abcdef"

3,concat(things) ->

string()

这里的things是一个列表,里面由atom() | integer() | float() |

将这个列表里面的元素拼成一个字符串,然后返回

lists:concat([doc, ‘/‘,

file, ‘.‘, 3]).

doc/file.3"

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"]

6,flatlength(deeplist) -> integer() >=

我的理解是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))

7,flatten(deeplist) ->

list

将deeplist变成只有term()的list

lists:flatten([[a,a],[b,b],[c,c]]).

[a,a,b,b,c,c]

8,flatten(deeplist, tail) ->

就是将deeplist变成只有term的list后,在后面再加一个tail。

lists:flatten([[a,a],[b,b],[c,c]],[dd]).

[a,a,b,b,c,c,dd]

9,keydelete(key, n, tuplelist1) ->

这个函数适合处理列表里面的元素是元组的情况

删除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是一样。

lists:keyfind("zhangjing",2,list1)

结果:{name,"zhangjing"}

11,keymember(key, n, tuplelist) ->

如果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个元素进行排序的

list2 =

[{nick,"zj"},{nick,"zs"}].

lists:keymerge(2,list1,list2).

[{name,"zhangjing"},

 {name,"zhangsan"},

 {nick,"zj"},

 {nick,"zs"}]

13,keyreplace(key, n, tuplelist1, newtuple) ->

在tuplelist1的tuple中找出第n个元素和key一致,然后用newtuple将这个tuple替换掉,如果没有找到

,则返回原来的tuplelist1

list1 = [{name,"zhangjing"},{name,"zhangsan"}]

lists:keyreplace("zhangjing",2,list1,{nickname,"netzj"}).

[{nickname,"netzj"},{name,"zhangsan"}]

14,keysearch(key, n, tuplelist) -> {value, tuple} |

这个函数和keyfind差不多,就是返回值的结构不一样

也是在tuplelist中找一个tuple,这个tuple的第n个元素和key一样。

[{name,"zhangjing"},{name,"zhangsan"}]

lists:keysearch("zhangjing",2,list1).

{value,{name,"zhangjing"}}

15,keysort(n, tuplelist1) ->

对tuplelist1中的tuple按照第n个元素进行排序,然后返回一个新的顺序的tuplelist。

不过这种排序是固定的。

list1 = [{name,"zhangsan"},{name,"zhangjing"}].

lists:keysort(2,list1).

16,keystore(key, n, tuplelist1, newtuple) ->

这个函数和keyreplace函数比较像,不同的是,这个keystore在没有找到对应的tuple时,

会将这个newtuple追加在这个tuplelist1的最后。

[{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} |

在tuplelist1中找tuple,这个tuple的第n个元素和key一致,如果找到了这么一个tuple

那么返回,{value,

tuple, tuplelist2} 其中tuplelist2是去掉tuple的tuplelist1.

[{name,"zhangjing"},{name,"zhangsan"},{name,"lisi"}].

lists:keytake("zhangjing",2,list1).

{value,{name,"zhangjing"},[{name,"zhangsan"},{name,"lisi"}]}

18,last(list) -> last

返回:list最后一个元素

lists:last(list1).

{name,"lisi"}

19,max(list)

-> max

取出list中最大的元素,一般list是整型时比较适合。

lists:max([1,10,15,6]).

15

20,member(elem, list) ->

如果elem和list中的某个元素匹配(相同),那么返回true,否则返回false

lists:member({sex,"1"},[{sex,"1"},{sex,"2"},{sex,"3"}]).

21,merge(listoflists) -> list1

listoflists是一个列表,里面由子列表构成

这个函数的功能就是将这些子列表合并成一个列表。

lists:merge([[{11}],[{22}],[{33}]]).

[{11},{22},{33}]

22,merge(list1, list2) -> list3

list1和list2分别是一个列表,这个函数的功能是将这两个列表合并成一个列表。

lists:merge([11],[22]).

[11,22]

 23,

merge3(list1, list2, list3) -> list4

将list1,list2,list3合并成一个列表

lists:merge3([11],[22],[33,44]).

[11,22,33,44]

24,min(list) -> min

返回list中的最小的元素,和max函数对应

lists:min([1,2,3]).

1

25,nth(n, list)

-> elem

返回list中的第n个元素。

lists:nth(2,[{name,"zhangsan"},{name,"lisi"},{name,"wangmazi"}]).

26,nthtail(n, list) -> tail

返回list列表中第n个元素后面的元素

lists:nthtail(3, [a, b, c, d, e]).

[d,e]

27,prefix(list1, list2) ->

如果list1是list2的前缀(也就是说list1和list2前部分相同),那么返回true,否则返回false

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]

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]

32,sort(list1) ->

将list1中的元素从小到大排序,然后返回新的一个列表。

lists:sort([3,2,1]).

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]}

这个函数和partition数有区别,partition是遍历全部的list,而splitwith在遍历时遇到false的情况

则马上结束遍历,返回结果。

34,sublist(list1, len) ->

返回从第一个元素到第len个元素的列表,这个len大于list1的长度时,返回全部。

lists:sublist([1,2,3,4,5,6],3).

35,sublist(list1, start, len) ->

返回从list1的第start个位置开始,后面len个元素的列表。

lists:sublist([1,2,3,4], 2,

2).

[2,3]

36,subtract(list1, list2) ->

等同于 list1 --

这个函数功能是返回一个list1的副本,对于list2中的每个元素,第一次在list1副本中出现时被删掉。

lists:subtract("112233","12").

"1233"

37,suffix(list1, list2) ->

如果list1是list2的后缀,那么返回true,否则返回false

lists:suffix("22","1122").

38,sum(list) ->

number()

返回list中每个元素的和。其中list中的元素都应该是number()类型的。

lists:sum([1,2,3,4]).

10

39,ukeymerge(n, tuplelist1,

tuplelist2) -> tuplelist3

tuplelist1和tuplelist2里面的元素都是元组

将tuplelist1和tuplelist2合并,合并的规则是按照元组的第n个元素,如果第n个元素有相同的,那么保留tuplelist1中

的,删除tuplelist2中的。

40,ukeysort(n, tuplelist1) ->

tuplelist1里面的元素都是元组

这个函数也同样返回一个元素是元组的列表,返回的这个列表是按照元组的第n个元素来排序的,如果元组中有出现

第n个元素相同的情况,删除掉后面的一个元组。

lists:ukeysort(1,[{name,"zhangsan"},{sex,"male"},{name,"himan"}]).

[{name,"zhangsan"},{sex,"male"}]

41,umerge(listoflists) ->

list1

这个函数和merge唯一不同的就是,里面不能出现相同的元素,如果出现相同的,那么删除之,只保留一个唯一的

lists:umerge([[1,2],[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]

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"]}

注意,最终返回的是一个元组。

45,usort(list1)

将list1按照从小到大的顺序排序,如果排序后有重复的元素,删除重复的,只保存一个唯一的。

lists:usort([4,3,2,1,2,3,4]).

46,zip(list1,

list2) ->

将两个长度相同的列表合并成一个列表

list3是里面的每一个元组的第一个元素是从list1获取的,而每个元组的第二个元素是从list2中获取的

lists:zip([name,sex,city],["zhangsan","male","hangzhou"]).

[{name,"zhangsan"},{sex,"male"},{city,"hangzhou"}]

注意,如果list1和list2长度不一致,那么这个函数将会报错。

47,zip3(list1,

list2, list3) ->

将三个长度相同的列表合并成一个列表

每个元组的第三个元素是从list3中获取的。

lists:zip3([name,sex,city],["zhangsan","male","hangzhou"],["nick","1","zhejiang"]).

[{name,"zhangsan","nick"},

 {sex,"male","1"},

 {city,"hangzhou","zhejiang"}]