列表

2022/2/25 Python 基础

  列表是 Python 中最基本的数据结构,可以使用 [] 来创建列表,也可使用或list来将其他数据强制转换为列表。例如:

List = [1, 3, 4, 'You', 'Me'] 
1

  列表内的每个元素都可以为包括列表在内的其他任一类型的数据。

# 索引

  列表中每个元素的索引位置从左至右起,第一位为 0;从右至左起,最后一位为 -1。

# 提取

  可根据列表索引提取对应位置的元素。

List = [1, 3, 4, 'You', 'Me'] 
Fetch2 = List[2]
print(Fetch2)
1
2
3

执行结果:4

  也可根据列表索引区间提取多个元素组成新列表(切片提取)。

Fetch2_4 = List[2:4]
print(Fetch2_4)
1
2

执行结果:[4, 'You']

# 修改

List = [1, 3, 4, 'You', 'Me']
1

# 合并

M = [1, 3] + [4, 'You', 'Me']
print(M)
1
2

执行结果:[1, 3, 4, 'You', 'Me']

# 添加

  利用append函数在列表末尾添加 5

A = List.append(5)
print(A)
1
2

执行结果:[1, 3, 4, 'You', 'Me', 5]

# 插入

  利用insert函数在索引为 0 的位置添加 Insert

I = List.insert(0, 'Insert')
print(I)
1
2

执行结果:['Insert', 1, 3, 4, 'You', 'Me', 5]

# 剔除

  利用del 删除列表 I中索引为 0 的元素(Insert) 。

def I[0]
print(I)
1
2

执行结果:[1, 3, 4, 'You', 'Me', 5]

  继续利用 pop函数删除列表I末尾的元素(5)。

I.pop(-1)
print(I)
1
2

执行结果:[1, 3, 4, 'You', 'Me']

  继续利用 remove函数删除列表I中指定元素You(若指定元素出现多次,则仅移除索引最靠前的元素)。

I.remove('You')
print(I)
1
2

执行结果:[1, 3, 4, 'Me']

注意

这三种剔除均在原列表上修改,不需要重新赋值。

# 替换

List[0] = 'She'
print(List)
1
2

执行结果:['She', 3, 4, 'You', 'You', 'Me']

# 排序

# 正序
NUMList = [1, 4, 3, 5]
NUMList.sort() 
print(NUMList)
1
2
3
4

执行结果:[1, 3, 4, 5]

# 倒序
NUMList.reverse() # 或 NUMList.sort(reverse=True)
print(NUMList)
1
2
3

执行结果:[5, 4, 3, 1]

# 去重

  利用 set 将列表转为集合去重。

# 去重后元素正序排列
NUMList = [4, 1, 1, 5]
SLL = list(set(NUMList))
print(SLL)
1
2
3
4

执行结果:[1, 4, 5]

# 修正为原列表序列的顺序
SLL.sort(key = NUMList.index)
print(SLL)
1
2
3

执行结果:[4, 1, 5]

# 运算

方法 描述 示例 结果
len 取列表长度 len([1,2]) 2
* 重复列表 [1,2] * 2 [1, 2, 1, 2]
max 取最大值(仅对数字列表有效) max([1,2,3]) 3
max(key=len) 取嵌套列表元素中子元素最多的元素 max([['a','b'], [1,2,3,4]], key=len) [1, 2, 3, 4]
min 取最小值(仅对数字列表有效) min([1,2,3]) 1
min(key=len) 取嵌套列表元素中子元素最少的元素 min([['a','b'], [1,2,3,4]], key=len) ['a', 'b']
sum 取和(仅对数字列表有效) sum([1,2,3]) 6
sum([]) 展开嵌套列表 sum([['a','b'], [1,2]], []) ['a', 'b', 1, 2]
join 连接列表中的每个元素组成字符串 ''.join(['a','b']) ab

# 列表解析式

  列表解析式是将一个可迭代对象(如列表)转换成另一个列表的工具。示例:

A = [i for i in range(10000000)] # 用列表解析式生成 1千万个简单序列
1

  在转换过程中,也可以指定元素必须符合某一条件(if),并按照指定的表达式进行转换。例如:

A = [i for i in range(10000000) if i <= 1000]
1

# 效率对比

  生成 0~10000000 中每个自然数的平方。(windows 10内存:16GBCPU:Intel Core i5-8265U

import datetime as dt
1

  简单 for 循环:

T0 = dt.datetime.now()
A = []
for i in range(10000000):
    A.append(i**2)
T1 = dt.datetime.now()
print((T1 - T0).total_seconds())
1
2
3
4
5
6

耗时:4.065539 秒

  列表解析式:

T0 = dt.datetime.now()
A = [i**2 for i in range(10000000)]
T1 = dt.datetime.now()
print((T1 - T0).total_seconds())
1
2
3
4

耗时:3.151168 秒

  numpy 向量化:

import numpy as np
T0 = dt.datetime.now()
A = np.arange(10000000) ** 2
T1 = dt.datetime.now()
print((T1 - T0).total_seconds())
1
2
3
4
5

耗时:0.139675 秒

  与 for 循环相比,列表解析式效率更高,但两者效率均远低于 numpy 的生成速率。处理纯数字型数据推荐使用 numpy,其他类型可优先使用列表解析式。

# 排列组合

  若对列表元素顺序有需求,可对列表实现排列组合(数学)。

from itertools import permutations
PMT = list(permutations(['Name', 'Year', 'Month']))
print(PMT)
1
2
3

执行结果:[('Name', 'Year', 'Month'), ('Name', 'Month', 'Year'), ('Year', 'Name', 'Month'), ('Year', 'Month', 'Name'), ('Month', 'Name', 'Year'), ('Month', 'Year', 'Name')]