操作list的几个基础函数

Posted 牧羊龟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作list的几个基础函数相关的知识,希望对你有一定的参考价值。

第一个小函数

在Haskell中,函数通过输入名称、空格和参数(用空格分隔)来调用,例如

succ 8
min 9 10
min 3.4 3.2
max 100 101

函数的调用(通过在函数后面加空格然后写入其参数来调用函数)具有最高的优先级
例如,下面两行代码是等价的

succ 9 + max 5 4 + 1
(succ 9) + (max 5 4) + 1

在Haskell中,空格是用来调用函数的

函数的定义与调用类似,函数名后面跟着用空格分隔的参数,但定义函数时有一个 =,后面定义函数的功能,例如

doubleMe x = x + x
doubleUs x y = doubleMe x + doubleMe y

在Haskell中,每个表达式或函数必须返回一个值,例如

doubleSmallNumber x = if x > 100 then x else x * 2

函数的名字不能以大写字母开头

不带任何参数的函数也称为definition定义,例如

muyang\'ui = "hello, it\'s me, muyangui"

对list的介绍

在Haskell中,list是homogeneous同构数据结构,存储相同类型的多个项

"hello" 只是 [\'h\',\'e\',\'l\',\'l\',\'o\'] 的一种语法替代,字符串只是字符的list,我们可以对其使用list操作的函数,这非常有用

++操作符,连接两个list

[1, 2, 3, 4] ++ [9, 10, 11, 12]
"hello" ++ " " ++ "world"
[\'h\', \'e\', \'l\'] ++ [\'l\', \'o\']

当连接两个list时,Haskell内部必须从 ++操作符的左侧遍历整个list,在连接大的list时需要一段时间

:操作符,将一个项添加到list的开头

\'a\' : "black cat"
0 : [1, 2, 3, 4, 5]
1 : 2 : 3 : []

[1,2,3]是1 :2 :3 :[]的语法替代

!! 操作符,从list中获取一个已知其索引的项,索引从0开头

"hello world" !! 4
[1, 2, 4, 5, 6, 7, 3, 9, 8] !! 5

当在只有4项的list中获取第6项时,将得到一个错误,所以要小心

操作list的几个基本函数

head,tail,last,init

head返回list的第一个元素

head [1, 2, 3, 4, 5]
1

tail返回list除了第一个元素的list

tail [1, 2, 3, 4, 5]
[2, 3, 4, 5]

last返回list的最后一个元素

last [1, 2, 3, 4, 5]
5

init返回list除了最后一个元素的list

init [1, 2, 3, 4, 5]
[1, 2, 3, 4]

当使用head,tail,last,init时,注意不要使用空列表

length 返回list的大小

length [1, 2, 3, 4, 5 ,6]
6

null 检查list是否为空,如果为空,则返回True,否则返回False

null [1, 2, 3]
False
null []
True

reverse 反转list

reverse [1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]

take 接受一个数字和一个list,并从list开头提取该数量的元素,返回list

take 3 [1, 2, 3, 4, 5]
[1, 2, 3]
take 1 [2, 4, 5]
[2]
take 6 [3, 4]
[3, 4]
take 0 [1, 2, 3, 4, 5]
[]

drop 接受一个数字和一个list,并从list开头删除该数量的元素,返回list

drop 3 [1, 2, 3, 4, 5, 6]
[4, 5, 6]
drop 0 [1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
drop 100 [1, 2, 3, 4]
[]

minimum, maximun 接受一个可以按某种顺序排列的list,并返回最小、最大的元素

minimum [8, 3, 4, 5, 2, 7, 6, 1]
1
maximum [8, 3, 4, 5, 2, 7, 6, 1]
8

sum 接受一个数字list,并返回它们元素的和

sum [5, 2, 1, 6, 3, 2, 5, 7]
31
sum [1.1, 2.2, 3.3. 4.4]
11.0

product 接受一个数字list,并返回它们元素的积

product [6, 2, 1, 2]
24
product [1, 2, 4, 6, 7, 0]
0

elem 接受一个元素和一个list,判断这个元素是否是list中的元素,如果是返回True,否则返回False

elem 4 [3, 4, 5, 6]
True
elem 6 [1, 2, 3, 4]
False

接受两个形参的函数,也称为中缀函数(infix function)可以写成如下形式,更明显清楚

4 `elem` [3, 4, 5, 6]
9 `div` 3

python之列表操作的几个函数

Python中的列表是可变的,这是它却别于元组和字符串最重要的特点,元组和字符串的元素不可修改。列举一些常用的列表操作的函数和方法。

1,list.append(x),将x追加到列表list末尾:

1 stack = [3,4,5] #定义列表
2 print(id(stack)) #打印列表的id值
3 stack.append(6) #将6追加到列表末尾
4 print(stack) #打印列表
5 print(id(stack)) #打猎列表的id值
6 stack.append(7) #将7追加到列表
7 print(stack) #打印列表
8 print(id(stack)) #打印列表的id值
9 ‘‘‘总结:通过打印id发现,append是在原对象的基础上新增元素,并没有改变原对象在内存中的存储。‘‘‘

2,list.extend(L),通过添加指定迭代器的所有元素来扩充列表,相当于a[len(a):] = L,其中L必须是可迭代的,如列表,字符串,字典,集合等。

 1 #list.extend(L),通过添加指定列表的所有元素来扩充列表,相当于,list[len(list):] = L
 2 #参数L必须是可迭代的,可以是列表,元组,字符串,字典。集合。
 3 
 4 a = [1] #定义原始列表
 5 sTring = string #定义字符串
 6 listNumber = list(range(2,20,3)) #定义数字列表,步长为3
 7 listString = [a,b,d,e] #定义字符串列表
 8 dictTa = {value:120131,label:Description,name:Python,} #定义字典
 9 setTa = set({value:120131,label:Description,name:Python,}) #定义集合
10 
11 print(a) #打印原始的列表a
12 print(id(a)) #打印原始列表的id值
13 
14 a.extend(sTring) #将字符串sTring作为参数传递给extend,以扩充原始列表a
15 print(type(sTring)) #打印下字符串列表的数据类型
16 print(a) #打印通过extend扩充字符串后的列表a
17 print(id(a)) #打印扩充后的列表的id值,与原始id值一样
18 
19 a.extend(listNumber) #将数字列表listNumber作为参数传递给extend,以扩充列表a
20 print(type(listNumber)) #打印一下数字列表的数据类型
21 print(a) #打印通过extend扩充数字列表后的列表a
22 print(id(a)) #打印扩充数字列表后的id值
23 
24 a.extend(listString) #将字符串列表作为参数传递给extend,以扩充列表a
25 print(type(listString)) #打印字符串列表的数据类型
26 print(a) #打印通过extend扩充字符串列表后的列表a
27 print(id(a)) #打印扩充字符串列表后的id值
28 
29 a.extend(dictTa) #将字典dictTa作为参数传递给extend,以扩充列表
30 print(type(dictTa)) #打印字典的数据类型
31 print(a) #打印通过extend扩充字典列表后的列表a
32 print(id(a)) #打印扩充字典后的id值
33 
34 a.extend(setTa) #将集合setTa作为参数传递给extend,以扩充列表a
35 print(type(setTa)) #打印集合setTa的数据类型
36 print(a) #打印通过extend扩充集合后的列表a
37 print(id(a)) #打印扩充集合后的id值
38 ‘‘‘总结,1,id值并没有变,也就是内存中数据存储并没有变;
39         2,字典和集合通过extend只扩充键,值没有一起被扩充;
40         3,字典和集合通过extend扩充,
41             字典的键是“有序”排列,即在字典中的位置是啥位置,扩充后在列表中也是对应;
42             而集合的键是“随机”排列;

3,list.insert(i,x) 在列表的指定位置插入元素。其中第一个参数i指定列表索引位置,第二个为要插入的值x。如list.insert(0,x),就是在列表的最前面插入元素x,list.insert(2,x),就表示在列表索引为2的位置插入元素x;list.insert(len(list),x),表示在列表末尾插入元素x,相当于list.append(x)。

 1 a = [1,2,3,4,5]
 2 b = [4,6,8,10]
 3 c = [a,b,c,d,e]
 4 d = list(range(1,100,20))
 5 
 6 a.insert(3,6) #在列表a索引为3的位置插入数字6
 7 a.insert(len(a),7) #在列表b末尾插入数字7,相当于a.append(7)
 8 b.insert(5,12) #在列表b索引为5的位置插入字符串12
 9 b.insert(len(b),14) #在列表b末尾插入字符串14,相当于b.append(‘14‘)
10 c.insert(3,f) #在列表c索引为3的位置插入字符串‘f‘
11 c.insert(len(c),g) #在列表c的末尾插入字符串g,相当于c.append(‘g‘)
12 d.insert(2,10) #在列表d索引为2的位置插入数字10
13 d.insert(len(d),100) #在列表d的末尾插入数字100,相当于d.append(100)

还有一个问题,如果insert指定的索引位置的值大于列表索引位置的最大值,即list.insert(i,x),当i>len(list)的时候,x将会被追加到列表末尾,相当于list.append(x)。

4,list.remove(x) 删除列表中第一个值为x的元素。如果没有,将引发一个ValueError的错误。为了方便演示,创建一个首尾相同元素的列表。

1 #list.remove(x) 删除列表list中值为x的第一个元素,如果值不存在就会返回一个错误
2 a = [a,b,c,d,e,a] #定义首尾元素相同的列表,方便演示
3 b = a.remove(a) #删除列表a里第一个值为字符串a的元素并赋值给变量b
4 print(a) #打印列表,列表中第一次出现的a被删除
5 print(b) #打印b,返回None
6 c = a.remove(a) #再删a,就把最后一个a也从列表删除了
7 print(a) #打印是否符合预期
8 print(c) #打印c,返回None

5,list.pop([i]) 从列表的指定位置删除元素(本人理解为从列表指定位置弹出元素),与remove不同,pop方法删除的元素是可以返回的。如果没有指定可选参数[i]的值,pop()从列表末尾开始删除。pop([i])方法中 i 两边的方括号表示这个参数是可选的,而不是要求输入一对方括号,经常在 Python 库参考手册中遇到这样的标记。为方便与remove对比,还是用上面的例子:

 1 a = [a,b,c,d,e,a] #定义首尾元素相同的列表,方便演示
 2 b = a.remove(a) #删除列表a里第一个值为字符串a的元素并赋值给变量b
 3 print(a) #打印列表,列表中第一次出现的a被删除
 4 print(b) #打印b,返回None
 5 c = a.remove(a) #再删a,就把最后一个a也从列表删除了
 6 print(a) #打印是否符合预期
 7 print(c) #打印c,返回None
 8 
 9 d = a.pop(1) #使用pop方法弹出列表a中索引为1的值
10 print(a) #打印列表a
11 print(d) #打印弹出的值,值为字符串c

6,list.clear() 移除列表中所有的项,但是保存列表list的数据类型,使用clear方法后,list返回一个空列表。等同于del list[:]

 1 a = [1,2,3,4,5] #定义数字列表b
 2 print(id(a)) #打印列表a的id值
 3 a.clear() #使用方法clear()清空列表中所有项
 4 print(a) #打印a,返回空列表
 5 print(type(a)) #打印数据类型,返回<class ‘list‘>
 6 print(id(a)) #再次打印列表a的id值,与没删除之前一样
 7 
 8 b = [2,3,4,5,6] #定义列表b
 9 print(id(b)) #打印列表b的id值
10 del b[:] #删除列表b在内存中的副本,b[:]表示列表b的一个切片,也可以理解为副本.
11 print(b) #打印列表b,返回[]
12 print(type(b)) #查看列表b的数据类型,返回<class ‘list‘>
13 print(id(b)) # 查看被清空后的列表b的id值与未清空之前是否相同
14 
15 c = [6,7,8,9,10] #定义列表c
16 print(c) #打印c,输出:[6, 7, 8, 9, 10]
17 del c #删除c
18 print(c) #打印c,NameError: name ‘c‘ is not defined

问题:列表b和列表c都是使用的del语句,列表b使用切片,内存中还有位置;列表c是把整个对象都删除了,在内存中根本没有了位置。要恶补内存,数据,存储,对象的知识。

7,list.index(x) 返回列表list中第一个值为x的索引,如果没有将返回一个ValueError: xxx is not in list错误。其中xxx是引发错误的值。

 1 a = [1,2,3,4,5] #定义数字列表
 2 b = [a,b,c,d,e,a] #定义字符串列表
 3 
 4 r1 = a.index(1) #获取值为1的索引
 5 print(r1)    #打印返回0
 6 r1 = a.index(2) #获取列表a中值为2的索引
 7 print(r1)    #打印返回1
 8 r1 = a.index(3) #获取列表a中值为3的索引
 9 print(r1)    #打印返回2
10 r1 = a.index(4) #获取列表a中值为4的索引
11 print(r1)    #打印返回3
12 r1 = a.index(5) #获取列表a中值为5的索引
13 print(r1)    #打印返回4
14 r1 = a.index(6) #尝试获取列表a中值为6的索引,因为值6根本不存在与列表中,返回错误ValueError: 6 is not in list
15 
16 
17 #循环读取索引
18 for index, value in enumerate(a):
19     print(index)
20 
21 for index in range(len(a)):
22     print(index)
23 
24 r2 = b.index(a) #获取列表b中第一个值为a的索引
25 print(r2)     #打印返回0
26 r2 = b.index(b) #获取列表b中第一个值为b的索引
27 print(r2)    #打印返回1
28 r2 = b.index(c) #获取列表b中第一个值为c的索引
29 print(r2)     #打印返回2
30 r2 = b.index(d) #获取列表b中第一个值为d的索引
31 print(r2)    #打印返回3
32 r2 = b.index(e) #获取列表b中第一个值为e的索引
33 print(r2)    #打印返回4
34 r2 = b.index(a) #还是获取列表b中第一个返回值为a的索引
35 print(r2)     #打印还是返回0
36 
37 #循环读取索引
38 for index, value in enumerate(b):
39     print(index)
40 
41 for index in range(len(b)):
42     print(index)
43     
44     

8,list.count(x) 统计x在列表list中出现的次数。

 

以上是关于操作list的几个基础函数的主要内容,如果未能解决你的问题,请参考以下文章

Java的几个List集合操作

浅谈类的几个基础构造函数

python的几个常用内置函数

20193420 敖轶凡《Python程序设计》实验报告四

1linux入门的几个基础操作

笨木头Lua专栏基础补充02:函数的几个特别之处