2、列表
2018-10-16 本文已影响0人
Yerban
列表
列表的特点:
- 有序;
- 编号,可以通过编号访问;
- 可遍历;
- 可追加/可插入;
- 可删除/可弹出;
- 可修改;
- 长度不定
# coding: utf-8
users = ['HL', 10, 20.3, True, False, [1, 2, 3]]
# 遍历列表users
for name in users:
print(name)
# type查看数据类型
print(type(users))
# 打印列表第一个元素,索引为0
print(users[0])
# 打印列表第三个元素,索引为2
print(users[2])
# 打印列表最后一个元素,索引为-1
print(users[-1])
# 打印列表最后二个元素,索引为-2
print(users[-2])
# 修改索引为"1"的值
users[1] = 'Fish'
print(users)
list() 方法用于将可迭代对象转换为列表
print(list('1234567'))
print(list('abcdefg'))
# str是可迭代对象,int、float不是
# print(list(4.5)) 错误
# print(list(123456)) 错误
range() 函数可创建一个整数列表
- range(start, stop, step)
- 默认start=0,步长step=1
print(list(range(10)))
for i in range(10):
print(i)
print(list(range(0, 10)))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(list(range(1, 10, 2)))
# [1, 3, 5, 7, 9]
print(list(range(9, 2, -3)))
# [9, 6, 3]
作业1:打印乘法口诀
- 提示:使用for
for column in range(1, 10):
for row in range(1, 10):
if row <= column:
print('%d * %d = %2d' % (row, column, row * column), end='\t')
print('\n')
作业2:nums2 = [6, 11, 7, 9, 4, 2, 1]列表中找到最大的
- 从nums中拿到第一个数字放到变量hand中
- 从第二个元素开始比较,如果比hand值大,则从新赋值
nums2 = [6, 11, 7, 9, 4, 2, 1]
hand = nums2[0]
for i in nums2:
if hand < i:
hand = i
print(hand)
# 变量hand为None,None => 什么都没有
# 从第一个元素开始比较,如果hand为None或者比hand值小,则从新赋值
nums2 = [6, 11, 7, 9, 4, 2, 1]
hand = None
for i in nums2:
if hand is None or hand > i:
hand = i
print(hand)
作业3:冒泡排序
- 移动nums中最大的数字到最后
- 提示:从左到右依次两两比较,如果前面比后面大,则交换位置。
- 第一次:6和11比较,前面小不交换,[6, 11, 7, 9, 4, 2, 1]
- 第二次:11和7比较,前面大交换,[6, 7, 11, 9, 4, 2, 1]
- 第三次:11和9比较,前面大交换,[6, 7, 9, 11, 4, 2, 1]
- 第四次:11和4比较,前面大交换,[6, 7, 9, 4, 11, 2, 1]
- 第五次:11和2比较,前面大交换,[6, 7, 9, 4, 2, 11, 1]
- 第六次:11和1比较,前面大交换,[6, 7, 9, 3, 2, 1, 11]
交换方法
- tmp = a; a = b; b = tmp
- a, b = b, a
'''
思路:
1、比较多少次 n-1
2、依次两两比较
for i in range(n-1)
nums[i], nums[i+1] = nums[i+1], nums[i]
3、如何进行交换
(1)tmp = a; a = b; b = tmp
(2)a, b = b, a
'''
nums2 = [6, 11, 7, 9, 4, 2, 1]
hand2 = nums2[0]
for j in range(len(nums2)-1):
for i in range(len(nums2)-1):
if nums2[i] > nums2[i+1]:
nums2[i], nums2[i+1] = nums2[i+1], nums2[i]
print(nums2)
获取list特殊值
# 获取list元素的数量
print(len(nums2))
# 获取list元素中的最大值和最小值
print(max(nums2))
print(min(nums2))
# 判断元素是否在list中存储
print(1 in nums2)
print(1 not in nums2)
print(12 in nums2)
赋值交换
x, y, z = 3, 6, 9
print(x, y, z)
x, y, z = y, z, x
print(x, y, z)
列表四则运算
nums2 += nums2
print(nums2)
nums3 = nums2 + [0, 0, 0]
print(nums3)
nums4 = nums2 * 2
print(nums4)
切片
- 按照规则获取list中一部分元素生成新的list
'''
list[start:end:step]
list[::step]
list[start:end]
list[:end]
list[start:]
list[:]
'''
nums5 = list(range(10))
print(nums5[1:9:2])
# [1, 3, 5, 7]
print(nums5[::5])
# [0, 5]
print(nums5[1:5])
# [1, 2, 3, 4]
print(nums5[:5])
# [0, 1, 2, 3, 4]
print(nums5[5:])
# [5, 6, 7, 8, 9]
print(nums5[:])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 翻转list
print(nums5[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(nums5[5::-1])
# [5, 4, 3, 2, 1, 0]
# 翻转list
print(nums5[::-1])
# [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
print(nums5[5::-1])
# [5, 4, 3, 2, 1, 0]
# 获取所有偶数索引
print(nums5[::2])
# [0, 2, 4, 6, 8]
# 获取所有奇数索引
print(nums5[1::2])
# [1, 3, 5, 7, 9]
# 获取所有倒序的奇数索引
print(nums5[::-2])
# [9, 7, 5, 3, 1]
# 获取所有倒序的偶数索引
print(nums5[-2::-2])
# [8, 6, 4, 2, 0]
切片复制(详见2.1)
# 对象赋值,直接改变了原来的nums5
nums5 = list(range(10))
nums5_tmp = nums5
nums5_tmp[0] = 'HL'
print(nums5_tmp)
# ['HL', 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums5)
# ['HL', 1, 2, 3, 4, 5, 6, 7, 8, 9]
# python提供了一个id()函数,用于查询内存地址
print(id(nums5_tmp))
# 4443399944
print(id(nums5))
# 4443399944
# 复制,使用切片,不会直接改变原来的nums5
nums5 = list(range(10))
nums5_tmp = nums5[:]
nums5_tmp[0] = 'Fish'
print(nums5_tmp)
# ['Fish', 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums5)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(id(nums5_tmp))
# 4507257288
print(id(nums5))
# 4507260680
切片对list增删修改
切片的应用
- 语法:list_name[start:end] = [v_0, v_1, ..., v_n]
使用list_name[v_0, v_1, ..., v_n]替换切片对应的位置的元素- 当切片元素大于[v_0, v_1, ..., v_n]的数量按照顺序替换切片中的元素,切片中多余的元素将删除
- 当切片元素小于[v_0, v_1, ..., v_n]的数量,按照顺序替换切片中的元素,赋值list中多余的元素则添加到切片最右索引之后
nums5 = list(range(10))
# 对索引1-3进行更改
nums5[1:4] = ['a', 'b', 'c']
print(nums5)
# [0, 'a', 'b', 'c', 4, 5, 6, 7, 8, 9]
# 对索引4-6进行删除
nums5[4:7] = []
print(nums5)
# [0, 'a', 'b', 'c', 7, 8, 9]
# 在索引4处进行添加
nums5[4:4] = ['e', 'f', 'g', 'h']
print(nums5)
# [0, 'a', 'b', 'c', 'e', 'f', 'g', 'h', 7, 8, 9]
# 情况一、将切片中多余的元素删除掉了。原本索引4-7有四个元素,对索引4-7赋了3值,所以多余的元素删除掉了。
print(nums5[4:8])
# ['e', 'f', 'g', 'h']
nums5[4:8] = ['a', 'b', 'c']
print(nums5)
# [0, 'a', 'b', 'c', 'a', 'b', 'c', 7, 8, 9]
# 情况二、在索引list[:4]处依次增加多余的元素。原本索引1-3有3个元素,对索引1-3赋了5个值,依次增加多出来的元素将排在最大索引后面。
print(nums5[1:4])
# ['a', 'b', 'c']
nums5[1:4] = ['e', 'f', 'g', 'h', 'i']
print(nums5)
# [0, 'e', 'f', 'g', 'h', 'i', 'a', 'b', 'c', 7, 8, 9]
列表函数
dir()是查看有哪些函数,help()查询函数的用法
- append:添加元素到list最右侧
- clear:清空list中的元素
- copy:复制list中的所有元素到新list中并返回
- count:计算list中存在相同元素的数量
- extend:将一个可遍历数据中的所有元素最佳到list后
- index:获取元素在list中出现的位置
- insert:在list指定位置添加元素
- pop:弹出list中指定位置的元素(默认最右侧)
- remove:移除list中指定的元素
- reverse:对list中元素进行反转
- sort:对list中元素进行排序
- 查看帮助
# dir() 函数不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
print(dir(list))
# help() 函数用于查看函数或模块用途的详细说明。
print(help(list.append))
print(help(list.clear))
- append:添加元素到list最右
nums6 = list(range(5))
nums6.append('abc')
print(nums6)
# [0, 1, 2, 3, 4, 'abc']
nums6.append(['abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'abc', ['abc']]
nums6.append([1, 2, 'abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'abc', ['abc'], [1, 2, 'abc']]
- extend:将一个可遍历数据中的所有元素最佳到list后
nums6 = list(range(5))
nums6.extend('abc')
print(nums6)
# [0, 1, 2, 3, 4, 'a', 'b', 'c']
nums6.extend(['abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'a', 'b', 'c', 'abc']
nums6.extend([1, 2, 'abc'])
print(nums6)
# [0, 1, 2, 3, 4, 'a', 'b', 'c', 'abc', 1, 2, 'abc']
- append会将添加的list当成一个整体添加到list中去;append 接受一个参数,这个参数可以是任何数据类型,并且简单地追加到 list 的尾部。
- extend是将添加的list当成单独的元素添加到list中;extend 接受一个参数,这个参数总是一个 list,并且把这个 list 中的每个元素添加到原 list 中。
- clear:清空list中的元素
nums6 = list(range(5))
nums6.clear()
print(nums6)
# []
# 和切片清空的方式对比
nums6 = list(range(5))
nums6[:] = []
print(nums6)
# []
- copy:复制list中的所有元素到新list中并返回,详见2.1Python深拷贝与浅拷贝。
nums6 = list(range(5))
print(nums6)
nums7 = nums6.copy()
print(nums7)
nums7[1] = 'HL'
print(nums7)
print(nums6)
# 和切片复制的方式对比
nums6 = list(range(5))
print(nums6)
nums7 = nums6[:]
nums7[1] = 'Fish'
print(nums7)
print(nums6)
- count:参数是任意类型,返回值是int类型,获取元素在list中出现的次数,list中没有时,返回0。
nums6 = list(range(5))
print(nums6)
nums6.extend([2])
nums6.extend([2, 2])
nums6.extend('22')
nums6.append(22)
nums6.append('22')
print(nums6)
# [0, 1, 2, 3, 4, 2, 2, 2, '2', '2', 22, '22']
print(nums6.count(2))
# 4
print(nums6.count('2'))
# 2
print(nums6.count('a'))
# 0
- index:参数是任意类型,返回值是int类型,获取元素在list中出现的位置,不存在则报错,可以指定查找list的start和end范围。
- str.index(str, beg=0, end=len(string))
print(nums6.index(2))
# 2
print(nums6.index('2'))
# 8
print(nums6.index('2', 9))
# 9
- pop:参数是整数,返回值是从list中弹出的元素。根据索引删除list中的元素,并返回,若索引不存在,则报错。pop默认是从最右侧删除。
print(nums6)
# [0, 1, 2, 3, 4, 2, 2, 2, '2', '2', 22, '22']
nums6.pop()
print(nums6)
# [0, 1, 2, 3, 4, 2, 2, 2, '2', '2', 22]
nums6.pop(0)
print(nums6)
# [1, 2, 3, 4, 2, 2, 2, '2', '2', 22]
nums6.pop(6)
print(nums6)
# [1, 2, 3, 4, 2, 2, '2', '2', 22]
- remove:参数是任意类型,没有返回值。从list中删除指定的值(第一次出现的元素),若值不存在,则报错。
nums6.remove('2')
print(nums6)
# [1, 2, 3, 4, 2, 2, '2', 22]
# 删除列表中元素
# 根据索引删除列表中元素
del nums6[0]
print(nums6)
# [2, 3, 4, 2, 2, '2', 22]
del nums6[-1]
print(nums6)
# [2, 3, 4, 2, 2, '2']
- 堆栈:先入后出
- append:从最右侧添加
- pop():从最右侧删除
- 队列:先入先出
- append:从最右侧添加
- pop(0):从最左侧删除
- reverse:对list中元素进行反转。参数类型无,返回值无。
nums6 = list(range(5))
nums6.reverse()
print(nums6)
# [4, 3, 2, 1, 0]
# 和切片对比
nums6 = list(range(5))
nums7 = nums6[::-1]
print(nums7)
# [4, 3, 2, 1, 0]
- sort:排序规则,是否反转。返回值无。对list中元素进行排序。
nums7.sort()
print(nums7)
# [0, 1, 2, 3, 4]
- insert:当索引大于或小于list原本的索引时,则在list对应的两端增加元素。索引不存在不会报错。
nums7.insert(-1000, 520)
print(nums7)
# [520, 0, 1, 2, 3, 4]
nums7.insert(10000, 'LOVE')
print(nums7)
# [520, 0, 1, 2, 3, 4, 'LOVE']
- 练习1、todolist
- 提示用户输入do或者任务(非do)
- 如果用户输入任务,则添加到list中
- 如果用户输入do,当任务为空时,则打印无任务并退出,否则从list中根据先进先出原则打印任务。
- 存储所有的任务用list,tasks
- while循环
- input
- 输入非do,append
输入do,按照先进先出的原则,(检查list是否为空,为空则打印无任务并打印退出)把任务弹出,并打印
tasks = []
while True:
tasks_name = input('Please input do or your a tasks:')
if tasks_name == 'do':
if len(tasks) == 0:
print('Tasks is None.')
break
else:
print(tasks.pop(0))
elif len(tasks_name) == 0:
continue
else:
tasks.append(tasks_name)
print(tasks)
- 练习2、获取两个list中相同的元素到第三个列表中
- nums8 = [1, 2, 3, 4, 5, 3, 10, 11]
- nums9 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
- 保证第三个list中元素不重复
- 定义第三个list,nums10
- 对第一个list进行遍历
- 从第一个list中依次取元素,和第二个list的对比
重复的放到第三个list
print('###### my execrcises ######')
nums10 = []
nums8 = [1, 2, 3, 4, 5, 3, 10, 11]
nums9 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
for i in nums8:
if nums9.count(i) > 0 and nums10.count(i) == 0:
nums10.append(i)
print(nums10)
print('###### teacher execrcises ######')
result = []
nums8 = [1, 2, 3, 4, 5, 3, 10, 11]
nums9 = [1, 2, 3, 1, 4, 5, 5, 3, 12, 34]
for i in nums8:
if i in nums9 and i not in result:
result.append(i)
print(result)