列表
简单来说列表就是由一系列按特定顺序排列的元素的集合
在Python中。用方括号 [] 来表示列表,并用逗号分隔其中的元素
访问的方式类似其他语言 变量名[index]
names = ["alices","bob","tom"] print(names[0]) print(names) print(names[-1]) # 不同于java,c++。这里是能使用-号的,表示倒着数,倒着是从1开始,但是倒着越界是会报错的 # print(names[3]) list = ["String", 1] # 没有报错,也就是说 python的列表的它的变量是一个原理,都是指向性的,并不是限定了类型 print(list)
有几点说明一下,因为Python不需要指定类型,所以Python中的列表里是可以放不同类型的元素的
对于列表内容的访问而言,存在一个越界问题,在Java或者C++中,角标不能为负,在Python中可以,角标为负代表倒着数
修改,删除,添加元素
list[0] = "alice" print(list[0]) # 修改就是直接换,而且这个就类似于变量那个原理,是能换类型的 list[0] = 0 print(list[0]) list.insert(0, ‘x‘) print(list.__len__()) list.insert(20, ‘w‘) # 这里注意一下,我插入的位置是20,但这个20是大于应该最后一个位置的,但它自动的默认了尾 print(list.__len__()) print(list) list.insert(-2, "m") # 果然 负数也是能使用的,意味着新插入的这个是 倒着的第x + 1, # 顺便说一下,如果这个负数的绝对值 大于了列表长度,类似于上面的20,那么会插到头的位置,而不是报错 list.append("sss") # 尾插的话 直接append,但好像没有提供头插的函数 print(list) del list[0] print(list) del list[-1] # 删的时候是 如果删 list[20],list[-20]的话是不能删的, print(list) list.pop() # 直接删除头部好像也没有直接的尾巴删,也就是说,python中的列表可以近似的看成是队列的形式, # 当然这个pop同与其他pop是弹射,也是说,返回第一个值并删除 # 再说一下,这个pop其实是可以弹任何位置的,只需要在括号里加索引号就行了 print(list) list.remove("m") # 上面是按索引删除,remove可以按值删除 print(list) # list.remove("non") # 删不存在的值是会报错的 print(list)
修改很简单直接修改,插入的话,其实有两种方式,主要是尾插和随意位置插入。需要注意的地方是使用insert()插入时,插入位置可以为负数,同时没有边界限制。也就是说,即使列表长度只有x,你在大于x的位置插入,也不会报错,它会插在最后面。而且,负数并非插在最前面,而是倒数的方式插入
删除的话,主要有三种方式,一种是直接删除某个位置的元素,这里注意使用del的时候,角标不能越界。第二个是pop()函数,也就是弹出首,这个函数会返回第一个位置的值并将其删除,说到这,是不是感觉Python中的列表很类似于队列,先进先出,尾插头出。当然这个pop函数其实是能弹任何位置的。只要将index传入就行了。第三种则是remove方法,按值删除,要注意的是,不能删除没有的元素,否则会报错
组织列表
排序,Python提供sort函数可以帮助数组快速排序,我现在还不清楚这个sort是怎么实现的(现在还不晓得查看源码的方式,不同于Java直接点就能看)。
# list2 = [0, 1, 2, ‘a‘, ‘b‘, ‘c‘, "Alice", "Bob", "Tom", ‘A‘, ‘B‘, "C", "addrress", "name"] # 数字和字符不能一起排序,也就是说,如果你要使用sort切记列表里的元素是同一类型的 list2 = [‘a‘, ‘b‘, ‘c‘, "Alice", "Bob", "Tom", ‘A‘, ‘B‘, "C", "addrress", "name"] print("list2 =", list2) list2.sort() # 这个sort是永久排序 sorted() 函数是临时排序 print("list2 =", list2) list2.reverse() # 翻转列表 print("list2 =", list2) print(len("abcd"), len(list2)) # len 这个函数是可以获取字符,列表的长度的,不能获取数字的长度,至于能不能获取对象,之后再看
Python 提供的sort() 函数是一种永久性排序,而sorted则是临时排序(用法 sorted(list))
需要注意的地方是,数字和字符串不能一起排序,也就是说,需要保证列表里是同一类型的。至于能不能排对象,是否那个类需要实现类似于Java中compareable接口之类的,后续学习的时候再深入。
reverse可以翻转列表,永久性。len可获取字符串长度,列表长度。不能获取数字长度。
其实对于列表的使用,我个人认为还是应该将同一类型的元素放在一个列表里。若非特殊使用,还是不要在一个列表里放多种元素
操作列表
遍历列表,遍历的方式当然是使用循环去遍历
lists = [‘b‘, ‘c‘, "Alice", "Bob", "Tom", ‘A‘, ‘B‘, "C", "addrress", "name"] for element in lists: # 这种循环方式就是典型的for-each循环,我不晓得python中是否有像java,c++中那样“标准”循环,或者while循环 # 注意缩进,这个缩进内 都表示要循环的,它就是一个 块 的概念 print(element, end = " ") # 不换行打印 a = 3 # 但是这个定义是全局的 print() print("a =", a)
Python中提供一种典型的for-each循环,做法很简单,如上。
需要注意的地方是,一是缩进。之前我就说过了,Python中的缩进有特殊含义,它代表了一个代码块。要循环的部分在这个块内,其余放块外。第二点,就是在这个块内定义的变量是全局的,不是局部的,出了这个块也可以使用。暂时留个疑问,Python中是否有局部变量这个概念
创建数字列表,Python中提供了简单的创建一串数字的方法
numbers = range(1, 5) # range函数并不是生成了一个列表 print(numbers) numbers = list(range(1, 5)) # 要这样使用才能创建列表,1 2 3 4 ,没有最后那一位,起名字时注意一下,列表尽量不要直接用list命名 #for index in range(0, 5, 1) 正确的来说,我建议最好写成这样子的,开始,结束,自增,这里是叠加的 for index in range(0, 5): # range 从0到4 也就说,如果想使用类似于“标准”循环 可以这样做 print(index, end = " ")
需要注意的地方是,使用range函数创建时,需要用list函数去包装
一些简单的统计
# 常规函数,最大,最小,求和 print() print(max(lists)) # 最大最小能用于字符型列表 print(min(numbers)) print(sum(numbers)) # 求和只能用于数字型 squares = [value**2 for value in range(1, 11)] # 快速创建,新人不建议使用,熟练后再 print(squares)
使用列表中的一部分,Python提供了切片这种方法,创建切片时,需要指定第一个元素的位置和最后一个元素的位置+1
# 切片 players = ["alice", "bob", "tom", "allen", "mark"] players_son = players[0:3] # 切片是能直接拿来做列表的,和range不同,不需要list去包装 # 多说一点,这个对象是新生成的,修改其内容不会影响到players print(players_son) print(players[-1:3]) # 没报错,什么也没打印 print(players[-3:-1]) # 负数的使用和之前的是一样的,越界不报错,越界按边界算 print(players[:5]) # 只写一边,另一边代表边界 players_son[0] = "none" players_copy = players[:] # 因为切片是新生成的,所以就可以这样拷贝 players_copy2 = players # 不能直接players_copy = players,否则两个变量就其实是一个对象了 players_copy2[0] = "none" print("\n", players) players_copy2 = players.copy() # 这个复制也会修改原内容 players_copy2[0] = "none" print("\n", players)
需要注意的地方,就是切点吧。因为Python中允许角标为负(老实说,我不太喜欢这点)所以在使用的时候,要注意区间范围,如果是从负数跨正数会产生什么,负数到负数会产生什么,大到小产生什么,等等这系列问题,其实动手实践才能更好的去理解。还有一个很重要的地方就是对于切片生成的子集而言,是一个新的列表和源列表无关。
列表的复制,列表的复制依赖于列表的切片,只要不输入始末就代表了头和尾。如果直接使用 == 或者 copy 则不会产生新的列表,两个变量其实引的是同一个东西,改变一个另一个也会改变。
元祖,简单来说就是一个常量集,不能改变长度,也不能改变内容
# 元祖-不可变列表 players2 = ("alice", "bob", "tom", "allen", "mark") # 没有提供插入和删除函数,元祖应该是内容和长度都不可变的 # 其他使用方式和列表如出一辙 # 如何修改,其实只能是重新定义,如果需要用到修改,则去使用列表
最后要说的一点是代码格式,不要随意缩进,缩进的时候想明白这行代码应该出现在哪个位置,这是很重要的。
至于代码风格,每个人都不同,每个公司都不同,没法统一标准。但是尽量和大部分的分格靠弃肯定是没问题的。
原文:https://www.cnblogs.com/Moriarty-cx/p/11888468.html