Python之列表

一、列表的特点

  • 列表也是一种数据类型
  • 列表元素是有序的,有编号的
  • 列表元素的下标从0开始
  • 列表中的每一个值叫一个元素,编号叫下标(索引/角标):
stu_name=['崔海龙','杨帆','lrx',1,1.5]

这里,崔海龙是一个元素,它的索引是0。

二、列表操作

1、增删改查操作

#增:

使用.append()方法:

stu_name.append('杨月') #list的末尾追加元素

使用.insert()方法:

stu_name.insert(2,'小军')#在指定位置之前添加元素,要指定元素下标
  • 区别:

.append()是只能追加到list末尾,而.insert()可以指定角标位置。

  • 重复执行一条语句多次,会不会添加多个相同的值?

# #由于写代码都是在内存中运行的,一旦执行完毕就会释放变量,因此重复执行多次都只插入一个变量值,不会重复插入同样的值。

# # 列表定义的变量是在内存中执行的,一旦关闭程序就会丢失,而文件则是在磁盘中保存的,关闭程序不会丢失数据。

  • 重复添加多次,会不会添加多个相同的值?

会。一条语句就是添加一个值:

stu_name.insert(2,'小军')
stu_name.insert(2,'小军')
#结果为[x,x,'小军','小军',x]

 #改:

直接赋新值,覆盖原值:

stu_name[5]='孔垂顶'

#删:

  • 使用.pop()方法:

.pop()方法默认删的是最后一个元素。

stu_name.pop()#删除最后一个元素
stu_name.pop(4)#删除指定下标的元素
  • 使用.remove()方法:
stu_name.remove('小军')#删除指定的元素,如果有一样的元素,只会删掉第一个
  • 使用del方式:
del stu_name[-1]#下标从右往左数,-1代表最后一个,-2代表倒数第二个

区别:

  • .pop()里面是元素的下标,而.remove()里面是元素。
  • .pop()里面如果写的是不存在的下标,则运行会报错。
  • 如果存在多个相同的元素,.remove()只会删除第一个。
  • 如果想删除多个元素,就需要用到列表循环了。

下标:

  • 下标从右往左数,-1代表最后一个,-2代表倒数第二个;
  • 下标从左往右数,0代表第一个,1代表第2个。


#查:

  • 指定下标查:
my_list=['小黑','小白',1,1,2,1.5]
print(my_list[-1])
print(my_list[0])
  • 使用.index()方法查询指定元素的下标:
print('index方法:',my_list.index(3))#查找下标的元素

使用.index()方法,如果输入不存在的下标,则执行会报错。

  • 使用.count()方法查询某个元素在list里出现的次数:
print(my_list.count(5))#查询某个元素在list里面出现的次数

.count()的应用场景:可以用于校验用户名

.count()里面是元素,而不是下标!

2、反转

使用.reverse()方法:

print('reverse:',my_list.reverse())#结果是None
print(my_list)#.reverse()本身不会给出结果,需要打印列表
  • .reverse()本身不会给出结果,没有返回值,需要打印列表

3、清空列表

使用.clear()方法:

my_list.clear()#清空整个list

4、排序

  • 使用.sort()方法,默认为升序排序:
nums.sort()#排序,默认升序
  • 使用.sort()方法,指定reverse=True,则降序排列:
nums.sort(reverse=True)#排序,如果指定了reverse=True,那么就降序排列了
  • 使用.reverse()方法,降序排序:
nums.reverse()

5、将其他列表里的元素加入到本列表中

使用.extend()方法:

nums.extend(my_list)#把一个list里面的元素加入到nums列表里面

6、合并列表

使用“+”进行列表合并:

new_list=nums+my_list

##    extend和+的区别:extend是将my_list的内容加入到nums里;而+是nums和my_list内容不变,重新建立一个新的list。

7、复制列表

使用“*”进行列表复制:

print(new_list*3) #复制3个new_list

8、取列表长度,也就是list里面元素的个数

使用len()方法:

passwords =['123456','123123','7891234','password']
print(len(passwords)) #取长度,也就是list里面元素的个数

三、列表应用

#校验手机号是否存在,使用.count()或 in  not in都可以
users =[]
for i in range(5):
    username=input('请输入用户名:')
    #如果用户不存在的话,就说明可以注册
    # if users.count(username)>0:
#关键字in   not in--------------------------------------------
    if username not in users:
        print('用户未注册,可以注册')
        users.append(username)
    else:
        print('用户已经被注册')

四、数组

nums1=[1,2,3] #一维数组
nums2=[1,2,3,[4,56]] #二维数组
nums=[1,2,3,4,['a','b','c','d','e',['','','']],['','']] #三维数组
nums4=[1,2,3,4,['a','b','c','d','e',['一','二','三',[1,2,3]]]]#四维数组
  • 多维数组取值:

三维数组取“五”:print(nums[-1][-1])

四维数组取“2”:print(nums4[-1][-1][-1][1])

五、列表循环

  • 原理

#循环list取值
count=0   #最原始的list取值方式,是通过每次计算下标来获取元素的
while count<len(passwords):
    s=passwords[count]
    print('每次循环的时候',s)
    count+=1
  • 利用元素下标进行循环

index = 0
for p in passwords:#for循环直接循环一个list,那么循环的时候就是每次计算下标获取元素
    print('每次循环的值'+p)
    passwords[index]='abc_'+p
    index+=1
print(passwords)

Python中的列表循环内置了列表下标,因此只用一个变量p就可以,p就是每次取下标时对应的元素值。

  • 使用enumerate()枚举函数

使用enumerate()函数,会自动将list的下标和元素都显示出来:

for index,p in enumerate(passwords):#使用枚举函数时,它会帮你计算下标和元素
    passwords[index]='abc_'+p
    print('enumerate每次循环的时候',index,p)
print(passwords)
  • 列表循环删除元素

  • 循环删list元素的时候,会导致下标错位:

1、现象:

l=[1,1,1,2,3,4,5]
  #1,1,2,3,4,5
  #0 1 2 3 4 5 6
for i in l:
    if i%2!=0:
        l.remove(i)    #.remove()里面是元素;.pop()里面是下标
print(l) #结果为[1,2,4]
#循环删list元素的时候,会导致下标错位

2、解决方法:

l1=[1,1,1,2,3,4,5]
  #1,1,2,3,4,5
  #0 1 2 3 4 5 6
l2=[1,1,1,2,3,4,5]
for i in l2:  #使用l2中的元素判断,删除l1里的元素,由于l1没有参与判断,因此下标不会错位
    if i%2!=0:
        l1.remove(i)    
print(l) #结果为[2,4]

循环删除列表元素时,要定义两个相同的列表,一个判断,另一个删除。

  • 存址方式:

列表中:

1、现象:

l1=[1,1,1,2,3,4,5]
  #1,1,2,3,4,5
  #0 1 2 3 4 5 6
l2=l1
for i in l2:  
    if i%2!=0:
        l1.remove(i)    
print(l1) #结果为[1,2,4]
#l1和l2其实指向的是同一块内存地址,因此删除l1的元素时,l2也会跟着变

2、原因:

字符串中:

 1、现象:

a='tanailing'
b=a
a='niuniu'
print(b)#结果为tanailing
print(a)#结果为niuniu

2、原因:

  • 字符串是直接开辟新的内存空间,不会共用一块内存空间,因此修改了a的内容后,b不会变。

六、深拷贝与浅拷贝

1、现象:

l1=[1,1,1,2,3,4,5]
  #1,1,2,3,4,5
  #0 1 2 3 4 5 6
l2=l1  #浅拷贝
for i in l2:  
    if i%2!=0:
        l1.remove(i)    
print(l1)

#打印内存地址
print(id(l1))  #结果为:1986281423432
print(id(l2))  #结果为:1986281423432

2、用法:

import copy #引入copy模块
l1=[1,1,1,2,3,4,5]
  #1,1,2,3,4,5
  #0 1 2 3 4 5 6
l2=l1  #浅拷贝方式1
l4=l1.copy() #浅拷贝方式2

l3=copy.deepcopy()  #深拷贝

#打印内存地址
print(id(l1))  #结果:2629934030152
print(id(l2))  #结果:2629934030152
print(id(l3))  #结果:2629934028872

3、区别:

  • 浅拷贝内存地址不变,深拷贝内存地址改变。
  • 循环删除列表元素时,使用深拷贝方式。

七、切片

1、range()生成器

 就是list取值的一种方式。

  • 生成器range(),用于写列表的范围,如果只写一个数,就表示从0开始,到写入的值-1:
l=list(range(10))#生成的是[0,1,2,3,4,5,6,7,8,9]
  • 如果写入范围,则是从写入的第一个数值开始,从写入的第二个数-1结束:
l=list(range(1,11))
l=['a','b','c','d','e','j','k','l','m','n','o']
#   0   1   2   3   4   5   6   7   8   9   10
print(l[2:8])#顾头不顾尾
print(l[:5])#如果冒号前面没写的话,代表从0开始取的
print(l[4:])#如果冒号后面没写的话,代表取到最后
print(l[:])#如果冒号前后都没写的话,代表取全部

切片操作的特点:

  • 顾头不顾尾
  • 使用range()生成器时,如果冒号前面没写的话,代表从0开始取元素
  • 使用range()生成器时,如果冒号后面没写的话,代表取到最后的元素
  • 如果冒号前后都没写的话,代表取全部

2、 步长

步长是从自己元素开始,再走几步到想要的元素:

nums=list(range(1,11))
print(nums[1::2])#打印偶数
#1 2 3 4 5 6 ...10
print(nums[::2])#打印奇数
print(nums[::-2]) #取偶数,从右往左取值

步长特点:

  • 如果步长是正数的话,就从前往后开始取值;
  • 如果步长是负数的话,就从后往前开始取值,类似于reverse()。

 

原文地址:https://www.cnblogs.com/yanwuliu/p/9563519.html