2、列表

列表

列表的特点:

  • 有序;
  • 编号,可以通过编号访问;
  • 可遍历;
  • 可追加/可插入;
  • 可删除/可弹出;
  • 可修改;
  • 长度不定
# 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中根据先进先出原则打印任务。
  1. 存储所有的任务用list,tasks
  2. while循环
  3. input
  4. 输入非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中元素不重复
  1. 定义第三个list,nums10
  2. 对第一个list进行遍历
  3. 从第一个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)

你可能感兴趣的:(2、列表)