Skip to content

list(列表)

定义:列表是一种可变的、有序的数据结构,可以随时添加和删除其中的元素。

列表非常适合利用顺序和位置定位某一元素,尤其是当元素的顺序或内容经常发生改变时。与字符串不同,列表是可变的。可以直接对原始列表进行修改:添加新元素、删除或覆盖已有元素。

创建列表

  • list(列表) 是 Python 中使用最频繁的数据类型,在其他语言中通常叫做数组
  • 列表用 [] 定义,数据之间使用 , 分隔
  • 列表的索引从 0 开始。索引就是数据在列表中的位置编号,索引又可以被称为下标

001_列表示意图

提示

注意:从列表中取值时,如果 超出索引范围,程序会报错

python
>>> array = []  # 用 [] 创建空列表
>>> array
[]

创建一个列表

python
>>> arr2 = [1, 2, 3, 4, 5, 6, 7]
>>> arr2
[1, 2, 3, 4, 5, 6, 7]
>>> arr3 = [1, 2, 3, True, False, int, "str", arr2]  # 列表中可以存放多种数据
>>> arr3
[1, 2, 3, True, False, <class 'int'>, 'str', [1, 2, 3, 4, 5, 6, 7]]

类型转化

将其他序列类型转化为列表

python
>>> s = 'hello world !'
>>> s
'hello world !'
>>> list(s)  # 使用 list() 将其他数据类型转换成列表
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', ' ', '!']

列表的序列特征

在 Python 中序列是被排成一列的对象。只要是序列类型,都可以进行取值与切片。

列表取值

使用 arr[offset] 获取与修改元素

python
>>> arr = ['a', 'b', 'c', 'd', 'e', 'f']
>>> arr[0]  # 直接获取
'a'
>>> arr[-1]  # 可以使用负数获取
'f'

根据索引位置修改内容

python
>>> arr[0] = 'A'
>>> arr
['A', 'b', 'c', 'd', 'e', 'f']

列表切片

切片使用索引值来限定范围,从一个大的数据容器中切出小的字符串

Python 中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。

切片方法适用于 字符串、列表、元组

格式:[start:stop:step],中文就是 [起始值:结束值:步长]

  • start: 起始索引,从 0 开始,-1 表示结束
  • stop:结束索引
  • step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值
python
>>> arr = list(range(10))
>>> arr
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> arr[2:5]  # 指定区间切片
[2, 3, 4]
>>> arr[2:-2]  # 可以使用负数
[2, 3, 4, 5, 6, 7]

>>> arr[0:9]  # 从头开始切片
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> arr[0:]  # 切片到末尾
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(arr[0:10])
>>> arr[:]  # 省略参数切全部内容

>>> # 指定步长切片
>>> arr[0:9:1]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> arr[0:9:2]
[0, 2, 4, 6, 8]

案例

python
arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']

print([arr[1], arr[2], arr[3]])
"""
`[起始值:结束值:步长]` 
- start:  起始索引,从0开始,-1表示结束 
- stop:结束索引
- step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值
"""
print(arr[1:4])  # 列表切片, 顾首不顾尾
print(arr[-8:-5])  # 列表切片, 顾首不顾尾

# e
print(arr[0:5])
print(arr[4:8])  # 写了最后一个元素, 但是取不出来最后一个
print(arr[4:])  # 结束值省略,就可以取到最后一个数
print(arr[:])  # 起始值省略,默认从第一个开始取

# print(arr[4:10000])  # 切片的时候超出范围不会报错

"""切片步长"""
print('        arr:', arr)
print('arr[1:-1  ]:', arr[0:-1])
print('arr[1:-1:1]:', arr[0:-1:1])
print('arr[1:-1:2]:', arr[0:-1:2])
print('arr[1:-1:-1]:', arr[0:-1:-1])
print('arr[1:-1:-1]:', arr[7:0:-1])

print('arr[1:-1:-1]:', arr[::-1])  # 特殊用法 逆序列表

列表的方法

列表常用操作

ipython 中定义一个 列表,例如:arr = list()

输入 arr. 按下 TAB 键, ipython 会提示列表能够使用的函数如下:

python
In [1]: arr = list()

In [2]: arr.
arr.append()  arr.count()   arr.insert()  arr.reverse()
arr.clear()   arr.extend()  arr.pop()     arr.sort()   
arr.copy()    arr.index()   arr.remove()

可以到官方网址查询使用方法:

分类关键字 / 函数 / 方法说明
增加append()添加元素至尾部
insert()在指定位置插入数据
删除clear()清空列表
pop()默认弹出末尾数据
pop(index)弹出指定索引数据
remove(data)移除指定数据
修改extend(列表2)将列表2 的数据追加到列表
查询count(数据)统计数据出现的次数
index(内容)查询内容所在位置
其他copy()将列表复制一份
sort()排序
reverse()逆序列表

insert、append 需要达到熟练的程度,pop / sort 用的也比较多

列表大部分的方法都是就地操作(修改原来的内容), 拷贝一份进行操作(不会修改原来的值,但是会返回一个新的内容)

案例:

python
>>> arr = ['a', 'b', 'c', 'd', 'e']
>>> arr
['a', 'b', 'c', 'd', 'e']
>>> arr.append('f')  # 添加 'f' 元素到末尾
>>> arr
['a', 'b', 'c', 'd', 'e', 'f']

>>> arr.insert(0, 'A')  # 插入'A'元素到第一个
>>> arr
['A', 'a', 'b', 'c', 'd', 'e', 'f']

>>> arr.pop()  # 默认弹出最后一个元素
'f'
>>> arr
['A', 'a', 'b', 'c', 'd', 'e']

>>> arr.pop(0)  # 指定弹出第 0 个元素
'A'
>>> arr
['a', 'b', 'c', 'd', 'e']

>>> arr.remove('d')  # 指定删除内容为 'd' 的元素
>>> arr
['a', 'b', 'c', 'e']

>>> arr.index('c')  # 查询内容为 'c' 的元素在第几个位置
2

>>> arr.sort(reverse=True)  # 排序后将内容输出(默认为升序)
>>> arr
['e', 'c', 'b', 'a']

新增元素

python
>>> name_list = ['正心', '全栈', '编程']
# append 追加元素到列表末尾
>>> name_list.append('python')
>>> name_list
['正心', '全栈', '编程', 'python']
# insert 插入元素到指定位置之前
>>> name_list.insert(0, '0基础')
>>> name_list
['0基础', '正心', '全栈', '编程', 'python']

拓展列表

python
arr1 = ['老师1', '老师2']
arr2 = ['老师3', '老师4']

# arr1.append(arr2)  # append 是追加元素,如果追加的是列表,会把整个列表放进去
>>> arr1 = ['老师1', '老师2']
>>> arr2 = ['老师3', '老师4']
>>> arr1.append(arr2) 
>>> arr1
['老师1', '老师2', ['老师3', '老师4']]


# 遍历添加元素
>>> arr1 = ['老师1', '老师2']
>>> arr2 = ['老师3', '老师4']
>>> for name in arr2:
...     arr1.append(name)
... 
>>> arr1
['老师1', '老师2', '老师3', '老师4']


# extend  将一个列表的元素追加到另一个列表的末尾
>>> arr1 = ['老师1', '老师2']
>>> arr2 = ['老师3', '老师4']
>>> arr1.extend(arr2) 
>>> arr1
['老师1', '老师2', '老师3', '老师4']

删除元素

python
name_list = ['正心', '全栈', '编程', '老师1', '老师2']

# pop 默认弹出最后一个元素 (有返回值)

>>> name_list = ['正心', '全栈', '编程', '老师1', '老师2']
>>> item1 = name_list.pop()
>>> item2 = name_list.pop()
>>> item1, item2
('老师2', '老师1')


# pop(index) 可以指定索引进行弹出
>>> name_list
['正心', '全栈', '编程']
>>> item0 = name_list.pop(0)
>>> name_list
['全栈', '编程']
>>> item0
'正心'


# remove 指定内容进行删除
>>> item = name_list.remove('编程')  # remove 删除内容是没有返回值的
>>> item
>>> name_list
['全栈']
>>> name_list.remove('编程')  # 没有的内容再次删除会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

# 清空列表
>>> name_list.clear()
>>> name_list
[]

修改元素

python
name_list = ['正心', '老师2', '老师3']

# 修改列表元素
name_list[0] = '正心全栈编程'

print(name_list)

name_list.reverse()  # 列表逆序输出
print(name_list)

arr = [1, 5, 2, 3, 6, 8]
arr.sort(reverse=True)  # 列表排序
print(arr)

获取元素位置

python
>>> arr = ['正心', '老师2', '老师3']

# index 获取元素在列表当中的位置
>>> arr.index('老师2')
1
>>> arr[arr.index('老师2')]
'老师2'


# 如果元素不存在就会报错
>>> arr.index('老师4')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: '老师4' is not in list

# 统计元素在列表当中出现的次数
>>> arr.count('正心1')
0

# 获取列表长度
>>> len(arr)
3

案例-列表方法

分配位置

给员工分配位置

python
# 员工
name_list = ['邓永明', '廖德超', '张勇', '杨久林', '戴贵富', '秦代坤', '李元东', '田显余']
# 办公室名字
site_list = ['1号办公室1位置', '1号办公室2位置', '1号办公室3位置',
             '2号办公室1位置', '2号办公室2位置', '2号办公室3位置',
             '3号办公室1位置', '3号办公室2位置']

# 答案存放的列表
content = []
参考代码
python
# 员工
name_list = ['邓永明', '廖德超', '张勇', '杨久林', '戴贵富', '秦代坤', '李元东', '田显余']
# 办公室名字
site_list = ['1号办公室1位置', '1号办公室2位置', '1号办公室3位置',
             '2号办公室1位置', '2号办公室2位置', '2号办公室3位置',
             '3号办公室1位置', '3号办公室2位置']

# 答案存放的列表
content = []

for index in range(len(name_list)):
    content.append([name_list[index], site_list[index]])

print(content)

"""随机分配位置 随机数模块"""
import random

print(random.randint(1, 10))  # 生成 1-10 的随机数(包括10) 顾首又顾尾

移动位置

现有办公室座位表 seating 如下

先要求从 1 号办公室、2号办公室中分别随机抽一个安排到4号办公室去

  1. 随机从1号 2号办公室中选取一个人
  2. 将其安排到4号办公室去
  3. 最后先安排好的座位表打印
python
import random

seating = [
    ('1号办公室1位置', '戴贵富'),
    ('1号办公室2位置', '田显余'),
    ('1号办公室3位置', '李元东'),
    ('2号办公室1位置', '廖德超'),
    ('2号办公室2位置', '秦代坤'),
    ('2号办公室3位置', '杨久林'),
    ('3号办公室1位置', '邓永明'),
    ('3号办公室2位置', '张勇')
]

提示

可以导入随机函数模块 random

python
import random

random.randint(a, b)

[a, b] 之间返回一个随机整数,包括 a, b 本身。

参考代码
python
# 1. 随机从1号 2号办公室中选取一个人
person2 = seating.pop(random.randint(3, 5))
person1 = seating.pop(random.randint(0, 2))
print(person1, person2)

person2 = ('4号办公室1位置', person2[1])
person1 = ('4号办公室2位置', person1[1])

seating.append(person2)
seating.append(person1)

for site in seating:
    print(site)

随机安排座位

有 N 个人要参加会议,现在需要随机安排座位。

请用 python 实现将 N 个人随机安排座位

python
import random

# 有多少个人
name_list = [
    '邓永明', '廖德超', '张勇', '杨久林',
    '戴贵富', '秦代坤', '李元东', '田显余'
]

site_list = [
    '1号办公室1位置', '1号办公室2位置', '1号办公室3位置',
    '2号办公室1位置', '2号办公室2位置', '2号办公室3位置',
    '3号办公室1位置', '3号办公室2位置'
]

# 答案放这里
seating = []
参考代码
python
for i in range(len(site_list)):
    index = random.randint(0, len(site_list) - 1)
    data = site_list.pop(index)
    seating.append([name_list[i], data])
print(seating)

二维列表

python
# 定义:列表是一种可变的、有序的数据容器,可以随时添加和删除其中的元素
array = [1, 2, 3, 4, 5]
array2 = [
    # [1, 2, 3, 4, 5],
    array,
    ['1', '2', '3', '4'],
    "abscdfg",
]

print(array2[1])
print(array2[1][1])

"""根据下标遍历二维列表的值"""
# 取 二维列表里面的值
# len 获取一个对象的长度
array2_len = len(array2)
print(array2_len)
for i in range(array2_len):
    # print(i)
    print(array2[i])
    # 先获取二维列表的长度
    for j in range(len(array2[i])):
        print(array2[i][j])

"""直接遍历二维列表的值"""
for row in array2:
    for col in row:
        print(col)

""" 
    len 只能获取容器、序列等有长度的对象的长度
    根据下标遍历  :就能去修改里面的值,可以精确的操作某一个元素
    直接遍历      :只能把内容一个个遍历出来
"""

案例:古诗词转置

python
"""  
案例展示用 python 实现古诗词横竖两种版本效果图  
  
实现横向打印效果如下  
千山鸟飞绝  
万尽人踪灭  
孤舟梭立翁  
独钓寒江雪  
  
实现竖向打印效果如下  
千万孤独  
山尽舟钓  
鸟人梭寒  
飞踪立江  
绝灭翁雪  
"""
python
poetry = [
    ['千', '山', '鸟', '飞', '绝'],
    ['万', '尽', '人', '踪', '灭'],
    ['孤', '舟', '梭', '立', '翁'],
    ['独', '钓', '寒', '江', '雪'],
]

for row_index in range(0, len(poetry)):
    # print('row_index', row_index)  
    # print(f'poetry[{row_index}]', poetry[row_index])    
    for col_index in range(0, len(poetry[row_index])):
        # print('col_index', col_index)  
        # print(f'poetry[{row_index}][{col_index}]', poetry[row_index][col_index])        
        print(poetry[row_index][col_index], end='\t')
        # row_index 0 1 2 3  
        # col_index 0 1 2 3 4        # print(poetry[col_index][row_index], end='\t')    
    print()

# 先获取列元素  
for col_index in range(0, len(poetry[0])):
    for row_index in range(0, len(poetry)):
        print(poetry[row_index][col_index], end='\t')
    print()