Python-数据类型之列表

列表和元祖都属于序列类型,该序列内可以包含任意数据类型,且数据存储是有序的,索引从0到1 

一:列表概述

1.1  如何定义一个列表

中括号,已逗号为分割符,可以放任意的数据类型,甚至是对象。

li = ['wangys','lala',123,[1,2,3],{'name':'wangys'}]
# 列表也可以嵌套
l2 = [['a','b'],[1,2],[]]

 

1.1.2  取单个元素,取出的是原数据类型

li = ['wangys','lala',123,[1,2,3],{'name':'wangys'}]
l1=li[0]
print(l1,type(l1))
l2=li[2]
print(l2,type(l2))
l3=li[3]
print(l3,type(l3))

1.1.2  取多个元素,取出的是列表类型

li = ['wangys','lala',123,[1,2,3],{'name':'wangys'}]
l4=li[0:2]
print(l4,type(l4))

二、  列表操作之-查

2.1   根据索引查找元素

索引是指元素在列表的位置顺序,从0开始,最有一个元素为长度-1

l = ['wangys',18,'male','IT']
print(l[0])  # 查看列表第一个元素即索引为0的元素
print(l[-1]) # 查看列表最后一个元素即索引为-1的元素
print(l[-2]) # 查看列表倒数第二个元素,即索引为-2的元素

结果如下:

 wangys
 IT
 male

如果索引过界,则会报错,并且后面的代码不会执行

l = ['wangys',18,'male','IT']
print(l[4] # 查看列表第5个元素,即索引为4的元素,索引过界,导致错误

结果如下:
IndexError: list index out of range

2.2  列表分片查找元素

  • 列表分片其实得到了一个子列表
  • 顾首不顾尾
l = ['wangys',18,'male','IT']
print(l[1:3])  # 取列表第二个(索引为1)到第三个元素(索引为2),但顾首不顾尾,所以取最后索引+1
# [18, 'male']

# 如果结束索引要早于开始索引,会产生一个空列表

l = ['wangys',18,'male','IT']
print(l[3:1])
print(l[-2:1])

[]
[]

# 省略开始索引,从第一个元素开始取值

l = ['wangys',18,'male','IT']
print(l[:2])
# ['wangys', 18]

# 省略结束索引,取到最后一个元素

l = ['wangys',18,'male','IT']
print(l[1:])
[18, 'male', 'IT']

# 开始索引和结束索引都省略,则复制整个列表

l = ['wangys',18,'male','IT']
print(l[:])

# 设置步长

默认步长为1,开始索引,结束索引,步长使用冒号分隔

l = [1,2,3,4,5,6,7,8,9,10]
print(l[1:9:2])
# [2, 4, 6, 8]

# 步长不能为0.如果为0,则报错

l = [1,2,3,4,5,6,7,8,9,10]
print(l[1:9:0])
# ValueError: slice step cannot be zero

# 如果步长为负数,那么开始索引要比结束索引要大

l = [1,2,3,4,5,6,7,8,9,10]
print(l[6:9:-2]) # 开始索引>结束索引,返回一个空列表
print(l[9:6:-2]) # 开始索引要大于结束索引

[]
[10, 8]

2.3   检查某个元素是否是列表元素

使用in关键字,如果在列表种返回True,不在返回False

info = ['wangys',18,'male']

print('wangys' in info)
print('female' in info)
True
False
account = [
    ['wangys','123456'],
    ['wc','123456'],
    ['xc','hello']
]

username = input('请输入用户名:')
password = input('请输入密码:')

if [username,password] in account:
    print('登录成功')
else:
    print('登录失败')

请输入用户名:wangys
请输入密码:123456
登录成功

2.4 查看列表中某个元素出现的个数

num = [1,2,3,1,2,4]
CountOf1=num.count(1)
print(CountOf1)

2.5 查看元素索引

  • 如果元素不存在报错
wangys_info = ["wangys",23,'male']
print(wangys_info.index('male'))
# 2
print(wangys_info.index('malea'))
# ValueError: 'malea' is not in list

三、列表操作之-增

3.1 append 

  • 在末尾相加
  • 一次只增加一个元素,无论要append的是单个元素还是一个列表
li = ['wangys','gongzhu']
li.append('caomei')
li.append('1')
print(li)

# 需求: 员工列表,往员工列表里添加员工,可以持续添加,当输入q时退出

people = ['wangys','huisz']
flag = True
while flag:
add_people = input("请输入员工姓名:").strip()
if add_people.upper() == 'Q':
flag = False
else:
people.append(add_people)
print(people)

# append的列表,会将该列表作为一个元素append

num = [1,2,3,4,5]
num.append([6,7])
print(num)

# [1, 2, 3, 4, 5, [6, 7]]

# 可以使用extend方法
num = [1,2,3,4,5]
num.extend([6,7])
print(num)
# [1, 2, 3, 4, 5, 6, 7]

3.2 insert 按照索引进行插入

name = ['wangys','chaoyf']
name.insert(1,'huisz')
print(name)

# ['wangys', 'huisz', 'chaoyf']

3. 3 extend 

  • 和相加类似,但相加产生了一个新的列表,二extend是修改原列表
  • extend 将可迭代对象插入到列表的末尾,插入的是可迭代对象的每个元素

整型是不可迭代对象

name = ['wangys','chaoyf']
name.extend('lala')
print(name)
# ['wangys', 'chaoyf', 'l', 'a', 'l', 'a']
name.extend([1,2,3]) print(name)

# ['wangys', 'chaoyf', 'l', 'a', 'l', 'a', 1, 2, 3]

四、列表操作之-删

4.1 pop 

  • pop 有返回值,该返回值是被删除的数据
  • 按索引删除
  • 不指定索引,把最后一个元素删除
  • 如果指定的索引不存在则报错 
name = ['wangys','lala']
delete_name = name.pop()
print(delete_name,name)
# lala ['wangys']
name = ["wangys","haha"] name.pop(0) print(name)
# ['haha']
name = ["wangys","hehe"] print(name.pop())
# hehe

 

# 索引不存在,报错
num1 = [1,2,3,4]
num1.pop(6)
print(num1)
# IndexError: pop index out of range

4.2 按照元素去删除

  • 默认删除匹配到的第一个元素
  • 如果元素不存在,则报错
name = ['wangys','dede']
name.remove('dede')
print(name)
# ['wangys']
nums = [1,2,3,4,5,6,3]
nums.remove(3)  删除列表中第一次匹配到的3元素
print(nums)

# [1, 2, 4, 5, 6, 3] # 可以看到确实是删除了,但后面的3没有删除
# 如果元素不存在,则报错
num1 = [1,2,3,4]
num1.remove('wangys')
print(num1)
# ValueError: list.remove(x): x not in list

4.3 清空列表

name = ["wangys","dsad"]
name.clear()
print(name)
# []

3.5.4 删除列表

name = ['wangys']
del name
print(name)

3.5.5 切片删除

name = ['wangys',"lala",'haha']
del name[1:]
print(name)

 

五、列表操作之-改

5.1 通过索引对列表进行修改

  • 索引过界会报错

·

wangys_info = ["wangys",23,'male']
wangys_info[0] = 'wc' # 修改列表第一个元素
print(wangys_info)
# ['wc', 23, 'male']


# 如果索引越界,则会报错
wangys_info = ["wangys",23,'male']
wangys_info[5] = 'wc'
print(wangys_info)

# IndexError: list assignment index out of range

5.2 分片字列表修改

  • 新旧子列表元素个数可以不相等
# 新旧字列表元素个数不相等
wangys_info = ["wangys",23,'male']
wangys_info[:2] = ['wc','18','IT']
print(wangys_info)
# ['wc', '18', 'IT', 'male']

# 新子列表是一个空列表
wangys_info = ["wangys",23,'male']
wangys_info[:2] = []
print(wangys_info)
# ['male']

六、列表其他操作

 

6.1 列表相加

  • 列表相加生成了一个新的列表,效率比较低,不建议使用
  • 可以使用extend方法将两个列表合并。

将两个列表合并

l1 = [1,2,3]
l2 = ['hello','world']
print(l1+l2)
# [1, 2, 3, 'hello', 'world']

6.2 列表乘法

l = ['wangys']
print(l*3)
['wangys', 'wangys', 'wangys']

6.3 len,max,min 在列表中的用法

  • len 返回列表的长度,元素个数
  • max,返回列表内元素的最大值
  • min,返回列表内元素的最小值
  • 使用max,min函数时列表中的元素必须具有可比较性,如果没有(比如,不同数据类型)则会报错
nums = [1,2,3]
print(max(nums))
print(min(nums))
3
1

info = ['wangys',18,'male']
print(len(info))
print(max(info))
print(min(info))
3
# TypeError: '>' not supported between instances of 'int' and 'str'

6.4 列表与其他数据类型的转换

6.4.1 str-list

使用list方法

name = 'wangys'
l = list(name)
print(l)
# ['w', 'a', 'n', 'g', 'y', 's']

6.5 排序

  • sort 会对原列表直接修改,如果是sorted函数会生成一个新的列表
  • 对列表进行排序时,列表中的元素必须是可比较的,如果不可比较,则报错

正向排序

num = [3,6,2,5,4]
num.sort()
print(num)
# [2, 3, 4, 5, 6]

反向排序

num = [3,6,2,5,4]
num.sort(reverse=True)
print(num)
# [6, 5, 4, 3, 2]

# 数据类型不一致,导致排序报错

info = ['wangys',18,'male']
info.sort()
print(info)
# TypeError: '<' not supported between instances of 'int' and 'str'

# sort和sorted

nums = [1,2,3,4,5]
nums.sort(reverse=True)
print(nums)
# [5, 4, 3, 2, 1]

nums = [1,2,3,4,5]
new_nums=sorted(nums,reverse=True)
print(nums,new_nums)
# [1, 2, 3, 4, 5] [5, 4, 3, 2, 1]

6.6 列表反转

num = [3,6,2,5,4]
num.reverse()
print(num)
# [4, 5, 2, 6, 3]

6.7  列表复制

  • 生成了一个新的列表
num1 = [1,2,3,4]
num2 = num1.copy()
print(id(num1),id(num2))
# id不一样,说明不是同一个列表,做了复制
# 2185254579656 2185254596744

6.8 列表嵌套

wangys_info = ['wangys',23,'male',['sing','play',22],25]

取出wangys里的a

wangys_info = ['wangys',23,'male',['sing','play',22],25]
print(wangys_info[0][1])

将列表的第一个元素大写并替换之前的元素

wangys_info = ['wangys',23,'male',['sing','play',22],25]
wangys_info[0] = wangys_info[0].capitalize()
print(wangys_info)

将王诚替换为王永胜

wangys_info = ['wangys',23,'王诚',['sing','play',22],25]
wangys_info[2] = wangys_info[2].replace('诚','永胜')
print(wangys_info)
wangys_info = ['wangys',23,'王诚',['sing','play',22],25]
wangys_info[3][1] = wangys_info[3][1].upper()
print(wangys_info)

 七、列表推导式

# 将name字符串的每个字符转换为ACII码
# 普通方法
name = 'wangys'
l = []
for  i in name:
    l.append(ord(i))
print(l)
# 列表推导式方法
l =[ord(i) for i in name]
print(l)

八: For循环

  • 列表是可迭代对象,可以for循环去除列表的数据
  • for循环列表的过程中,如果做删除操作,不安全

8.2  正确删除列表中元素的方式

直接删除会有问题

# 直接删除,会出问题
lst = ['张国荣','张三','张大千','李世民'] for el in lst: if el.startswith(''): lst.remove(el) print(lst) # ['张三', '李世民']

正确做法,将要删除的元素刷选到新列表,循环新列表,删除旧列表

lst = ['张国荣','张三','张大千','李世民']
new_list = []
for el in lst:
    if el.startswith(''):
        new_list.append(el)

for el in new_list:
    lst.remove(el)
print(lst)

其他方法

将列表二元组转换为字典

a = [('a','b')]
b = [('c','d')]
print(dict(a+b)) # {'a': 'b', 'c': 'd'}
原文地址:https://www.cnblogs.com/wc89/p/10416246.html