列表LIST
认识list
- 列表是有序、可变的容器类型(元素数量、值可变),内部的元素可以任何类型.
- 列表是一种序列,可迭代
- 列表声明:
# 声明方式: 列表名 = [data1,data2...]
names = ['Lucian', 'Jin', ' ']
# 允许空列表[]
grade = []
# 其他类型(必须为序列)转换成list
f_list = (1,2,'list')
str_list = list(f_list)
print('f_list: %s.str_list: %s'%(f_list,str_list))
result:
f_list: (1, 2, 'list').str_list: [1, 2, 'list']
数据修改
获取列表元素
- a.获取单个元素
列表[下标]
- b.获取多个元素(切片)
# 列表[下标1:下标2] 同字符串的切片操作
# 列表[下标1:下标2:步长] 同字符串的切片操作
person_list = ['lucian', 'jin', 'lax', 'ez']
print('person_list[1:3]: %s' % (person_list[1:3]))
print('person_list[::2]: %s' % (person_list[::2]))
result:
person_list[1:3]: ['jin', 'lax']
person_list[::2]: ['lucian', 'lax']
- c.遍历列表
- 一个一个获取列表中的每个元素
for item in person_list: print(item)
- 写一个列表来保存一个班的学生的成绩,统计班上成绩在80以上的个数
student_grades = [10,90,50,80,40,60] count = 0 for item in student_grades: if item >= 80: count += 1 print('成绩大于80的人数:%d' % count) result: 成绩大于80的人数:2
修改列表元素
- 语法: 列表名[下标] = 新值 通过下标获取元素,并重新赋值.
- 注意: 重新赋值的索引必须存在,否则IndexError
child = ['小明', 10 , '幼稚园']
print(child)
child[0] = '小刚'
print(child)
result:
['小明', 10, '幼稚园']
['小刚', 10, '幼稚园']
- 增加列表元素
list.append(obj)
-- 在列表末尾添加一个元素
child.append('男')
print(child)
result:
['小刚', 10, '幼稚园', '男']
list.insert(index,obj)
-- 在指定的索引位置添加一个元素
child.insert(1, '2008-10-1')
print(child)
result:
['小刚', '2008-10-1', 10, '幼稚园', '男']
- 案例:录入5名学生的成绩,并保存在一个列表中
student_list1 = []
student_list2 = []
for item in range(5):
grade = int(input('输入学生的成绩:'))
student_list1.append(grade)
student_list2.insert(0,grade)
print(student_list1)
print(student_list2)
result:
输入学生的成绩:11
输入学生的成绩:12
输入学生的成绩:13
输入学生的成绩:14
输入学生的成绩:15
[11, 12, 13, 14, 15]
[15, 14, 13, 12, 11]
删除列表元素
-
del 列表[下标]
删除指定索引的数据
foods = ['辣条','ice cream','干脆面','牛板筋','cola']
del foods[2]
print(foods)
result:
['辣条', 'ice cream', '牛板筋', 'cola']
-
del 列表
删除整个列表 -
列表.remove(obj)
删除指定的符合的第一条数据
foods.remove('ice cream')
print(foods)
result:
['辣条', '牛板筋', 'cola']
-
列表.pop(index)
将列表中指定的索引对应的数据拿出来
cola = foods.pop(2)
print(cola,foods)
result:
cola ['辣条', '牛板筋']
- 案例:将一个保存成绩的列表中,成绩低于60的成绩全部删除
num_list = [78,59,40,90,89,45,69,30]
# 在做数据遍历又需要保存原数据的时候,使用数据的拷贝
for item in num_list.copy(): #也可以使用num_list[:]来进行复制
if item < 60:
num_list.remove(item)
print(num_list)
result:
[78, 90, 89, 69]
数据存储
python中,变量在存储数据的值的时候,分为两种情况:
- 值类型: 变量存储数据直接存值--整型、浮点型、布尔、字符串
- 引用类型: 变量存数据的时候,存数据在内存中的地址--列表、元组、字典、集合、函数。引用类型赋值是赋的地址。
- 对比: 引用类型修改数据,不会修改地址。因此,对于直接复制的数据b,修改数据b的一项,原数据也会得到修改,因为它们所指向的数据块相同,地址相同.
需要使用拷贝就不会修改原数据。
list1 = [1,2,3]
list2 = list1
list3 = list1[:]
print(id(list1),id(list2),id(list3))
list1.append(4)
print(list1,list2,list3)
result:
40563016 40563016 39925560
[1, 2, 3, 4] [1, 2, 3, 4] [1, 2, 3]
相关运算
+ 操作
list1 + list2
list1中元素和list2中的元素全部放在一起
list1 = [1,2,3]
list2 = list1 + [1,2,3]
print(list2)
result:
[1, 2, 3, 1, 2, 3]
* 操作
list1 * N
将list1中元素重复N次,产生一个新列表
list3 = list1*2
print(list3)
result:
[1, 2, 3, 1, 2, 3]
in / not in
obj in list
判断一个元素是否在列表list中
列表长度
len(list)
获取列表list的长度
相关的方法
函数 | 含义 |
---|---|
list.count(obj) | 统计list中obj元素的数量 |
list.extend(seq) | 在list的后面添加seq序列中每个元素 |
list.index(obj) | 获取obj元素的索引 |
list.pop(index) | 从列表中取出指定索引位置的元素,如果不写index,则取出最后一位 |
list.reverse() | 逆序输出列表 |
list.sort(reverse=False) | 对列表进行排序操作,默认升序排序;如果reverse=True,则为降序排序 |
list.clear() | 删除列表中的所有元素 |
list.copy() | 将列表中的元素进行拷贝形成新列表,相当于[:].此处的拷贝是浅拷贝 |
深拷贝和浅拷贝
-
浅拷贝
只是拷贝列表里每个元素的值(若是对象就拷贝对象的地址),拷贝前后列表里面的子序列还是指向同一个地址 -
深拷贝
拷贝列表里面的元素的值,遇到子序列就拷贝子序列,产生新的地址。若在子序列中有子序列就再拷贝一次,再产生一次新地址。保证引用类型的序列都拷贝了一份。因此修改子序列里的值,不会对原列表产生影响。 - 浅拷贝案例
numbers1 = [1,2]
numbers = [numbers1, 4,5]
new_numbers = numbers.copy()
numbers1.append(3)
print('浅拷贝',numbers, new_numbers)
result:
浅拷贝 [[1, 2, 3], 4, 5] [[1, 2, 3], 4, 5]
- 深拷贝案例
import copy
numbers1_1 = [1,2]
numbers_1 = [numbers1_1, 4,5]
new_numbers_1 = copy.deepcopy(numbers_1)
numbers1_1.append(3)
print('深拷贝',numbers_1, new_numbers_1)
result:
深拷贝 [[1, 2, 3], 4, 5] [[1, 2], 4, 5]
元组Tuple
元组就是不可变的列表,除可变相关的内容外,其他都与列表相同
声明元组
元组 = (内容1,内容2...)
tuple1 = (1,2,'a',[3,4])
tuple2 = ()
tuple3 = (1,)
注意:当声明只有一个元素的元组时,需要在其后加逗号 。
获取元素
-
tuple[index]
--获取元组指定索引位置的值 -
tuple[下标1:下标2]
--获取含下标1到下标2之前的值 -
tuple[下标1:下标2:步长]
--获取含下标1到下标2之前,指定步长的值
特殊操作
- 指定坐标值
point = (3, 4)
print('x:',point[0],'y:',point[1])
- 对两个变量同时指定一个值
a, b = 2
print(a, b)
- 对涉及含两个变量以上的同时计算,计算时不改变变量的值
a = c = 2
b = d = 5
a,b = b,a+2
(c,d) = (d,c+2)
print(a,b,c,d)
result:
5 4 5 4
- 通过在变量加 * 号,获取元组、列表中一部分元素值,结果是一个列表
user = ('Double Kou', '蜂蜜柚子茶','Lucian',2,5)
*name,year = user #对于含*的部分,获取大部分值,没有*的只返回一个值。只能有一个*.
print('*name:',name,'year',year)
result:
*name: ['Double Kou', '蜂蜜柚子茶', 'Lucian', 2] year 5