Skip to content

列表和元组

列表

list

可下标类型(subscriptable) 可迭代类型(Iterable) 可变类型(mutable) 有序类型

使用方括号来创建列表

python
li = ["a", "b", "c", "d"]

索引和切片

shell
>>> li[0]
'a'
>>> li[1:2]
['b']

与字符串切片功能不同之处:

  • 进行获取、切片、赋值给其他变量等 (getitem)得到的是其浅拷贝
  • 进行直接赋值(setitem)则会改变原列表

getitem 操作

python
a = [1, 2]
a[:1][0] = 5
print(a)
# 打印结果[1,2]

setitem 操作

python
a = [1, 2]
a[:1] = [5]
print(a)
# 打印结果[5,2]

关于切片

可以在学习面向对象的魔术方法后再深入研究

操作符

python
[] + []  # 拼合
[] * int  # 重复
item in []  # 判断成员是否存在 返回布尔值

常用内置函数

  • len(list)  获取长度
  • list()  转化为列表类型
  • max()/min()求最值,可选参数 key 进行操作
  • reversed(list)临时翻转,不限于列表
  • sorted(iterable)临时排序,不限于列表 ,可选 key 和倒序。
  • sum所有成员是数字的时候可用,求和,不限于列表

常用方法

  • ''.join(list) 将列表转为字符串
  • .count(value)计次
  • .copy()浅拷贝,和切片[:]等效

增删改查

  • .append(p) 追加
  • .extend(iterable)迭代追加
  • .insert(index,obj)插入
  • .pop(index=-1) 删除默认最后一个 并返回它的值
  • .remove(value) 删除
  • del 删除 索引/切片
  • .clear() 清空
  • .index(value)查询是否存在,不存在会报错

排序

.sort(key=..., reverse=...)永久排序
.reverse()倒序,相当于li[:] = li[::-1]的效果

.sort()即 list.sort(self)方法,和全局函数 sorted(iterable)

它们本质是快排算法两两比较大小
它们的参数完全一致(但 sorted 不限于列表)。不同的是:
列表的 sort 方法无返回值,直接修改 self
内置函数 sorted,返回临时排序后的列表

成员赋值

逐个赋值

python
arr = [1, 2, 3]
a, b, c = arr
# 其实是元组省略了括号 相当于(a, b, c) = arr
a
# 1
b
# 2
c
# 3

for 循环中

python
arr = [[1, 2], [2, 3], [3, 4]]
for a, b in arr:
    print(a, b)
# 其实还是元组省略了括号 相当于for (a, b) in arr
"""
1 2
2 3
3 4
"""

解构赋值

python
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
c, *d, e = arr1
# 此处 * 是聚合
# 同上,其实是元组(c, *d, e,)省略了括号
c
# 1
d
# [2, 3, 4, 5, 6, 7, 8]
e
# 9
arr2 = [e, *d]
# 此处 * 是打散
arr2
# [9, 2, 3, 4, 5, 6, 7, 8]

此方法不限于列表,字典需要使用**map,在函数参数声明以及传递中多见

元组

tuple

可下标类型(subscriptable) 可迭代类型(Iterable) 不可变类型(immutable)

元组中只包含一个元素时,必须在末尾元素后面添加逗号 (推荐所有情况都加逗号)
创建元组使用小括号(没有歧义时也可以省略小括号)

python
tup = (
    1,
    2,
    3,
    4,
    5,
)

索引和切片

shell
>>> tup[1]
2
>>> tup[:1]
(1,)

和字符串的索引和切片操作几乎一样。
元组的切片和索引只读(只有 getitem 操作)。

内置函数tuple()可以将对象转化为元组

常用方法

  • .count()
  • .index()

对象方法是返回新的对象还是修改对象本身

一般来说,对于可变类型 对象方法如list.sort()会影响到 self 本身
而对于不可变类型,对象方法如str.replace()会返回一个预期的新对象

内置函数 enumerate()

for i in 列表 只能遍历出列表成员,如果需要同时遍历出索引可以使用:
enumerate(sequence, [start=0]) 意为枚举,将一个可迭代的对象,同时列出数据和数据下标
可以用 list()函数把 enumerate()返回的枚举对象转为一个列表

python
li = ["a", "b", "c"]
list(enumerate(li))
# [(0, 'a'), (1, 'b'), (2, 'c')]

一般直接在 for 循环中使用

python
namelist = ["夏色祭", "赤井心", "湊阿夸"]
for i, name in enumerate(namelist):
    print(i, name)

"""打印内容
0 夏色祭
1 赤井心
2 湊阿夸
"""

内置函数 slice()

意为切片
slice(stop)
slice(start, stop[, step])

实例化一个切片对象,用来代替切片中的中括号内的内容

  • start -- 起始位置
  • stop -- 结束位置
  • step -- 间距

切片对象用索引的写法[slice(1,2)]可以达到切片的效果[1:2]

shell
>>> a = slice(10)
>>> print(a)
slice(None, 10, None)

>>> a = slice(1,10,2)
>>> print(a)
slice(1, 10, 2)

>>> print(a.start)
1

>>> print(a.stop)
10

>>> print(a.step)
2

>>> li = [1,2,3,4,5,6,7,8,9,0]
>>> li[slice(2,6)]
[3, 4, 5, 6]

如果 step 为负数,则 stop 也应小于 start

内置函数 range()

range(stop)
range(start, stop[, step])

参数类似切片,可创建一个整数列表,可以很方便的用在 for 循环中,
一般用来固定循环 for 次数,与其他语言中的for(i=0; i<length; i++)效果相似

python
"""
Python3.x 中 range() 函数返回的结果是一个整数序列的可迭代对象,而不是列表
可以用list()函数把range()返回的可迭代对象转为一个列表
"""

list(range(5))
# [0, 1, 2, 3, 4]

打印一个九九乘法表,来试试吧,例如:

python
a = ""
for i in range(1, 10):
    for j in range(1, i + 1):
        a += str(j) + "×" + str(i) + "=" + str(j * i) + " "
    a += "\n"
print(a)

字节数组

bytearray 类型 可变(mutable)的字节序列,相当于字节串bytes的可变版本。

创建

  • bytearray()
  • bytearray(短整型)
  • bytearray(可迭代对象[短整型])
  • bytearray(bytes 字面量即 b'字符串')
  • bytearray(字符串, encoding='utf-8')

常用方法

与 list 的方法类似 也与 bytes 的方法类似

  • .decode 转字符串
  • .append 追加
  • .reverse 倒序