Python列表(list)是有序、可变的序列,用中括号写成,元素类型可以混用,也能再嵌套列表。创建之后可以按下标改值,也可以增删元素。

下标和切片的规则与字符串相近,但列表允许原地修改,这是两者最大的差别之一。

先建一个列表

fruits = ["apple", "mango", "orange"]
print(fruits)          # ['apple', 'mango', 'orange']
print(fruits[0])       # apple
print(len(fruits))     # 3

创建列表

a = [1, 2, 3]
b = ["apple", 3.14, True, "x"]   # 混合类型
c = []                             # 空列表
d = [["a", 1], ["b", 2]]          # 嵌套列表
print(a, b, c)

下标与切片

正下标从 0 起,负下标从右边数,切片同样含头不含尾:

10 0 / -5 20 1 / -4 30 2 / -3 40 3 / -2 50 4 / -1 nums = [10, 20, 30, 40, 50]:按下标访问,支持正负下标和切片
nums[0] 是 10,nums[-1] 是 50;nums[1:4] 取 [20, 30, 40](含头不含尾)。
nums = [10, 20, 30, 40, 50]
print(nums[0])      # 10
print(nums[-1])     # 50
print(nums[1:4])    # [20, 30, 40]
print(nums[::-1])   # [50, 40, 30, 20, 10],反转

修改元素

直接按下标赋值即可,切片位置也可以一次性换成另一段序列:

nums = [1, 2, 3]
nums[0] = 99
print(nums)          # [99, 2, 3]

nums[1:3] = [8, 8]   # 切片也能赋值
print(nums)          # [99, 8, 8]

添加元素

fruits = ["apple"]
fruits.append("banana")        # 末尾加一个
print(fruits)                  # ['apple', 'banana']

fruits.insert(1, "orange")     # 指定位置插入
print(fruits)                  # ['apple', 'orange', 'banana']

fruits.extend(["kiwi", "grape"])  # 末尾加多个
print(fruits)                  # ['apple', 'orange', 'banana', 'kiwi', 'grape']

删除元素

nums = [1, 2, 3, 4, 5]
nums.remove(3)       # 按值删第一个匹配项
print(nums)          # [1, 2, 4, 5]

popped = nums.pop()  # 删除并返回末尾元素
print(popped, nums)  # 5 [1, 2, 4]

nums.pop(0)          # 删除指定下标
print(nums)          # [2, 4]

del nums[0]          # del 也能删
print(nums)          # [4]

遍历列表

nums = [3, 1, 4, 1, 5]
for n in nums:
    print(n, end=" ")   # 3 1 4 1 5
print()

# 需要下标时用 enumerate
for i, n in enumerate(nums):
    print(f"index={i}, value={n}")

成员判断与排序

nums = [5, 2, 9, 1]
print(2 in nums)        # True
print(nums.index(9))    # 2,9 的下标

nums.sort()             # 原地升序
print(nums)             # [1, 2, 5, 9]
nums.reverse()          # 原地反转
print(nums)             # [9, 5, 2, 1]

# sorted 返回新列表,不改原列表
original = [3, 1, 2]
new = sorted(original)
print(original, new)    # [3, 1, 2] [1, 2, 3]

复制列表的常见误区

b = a 只是让两个名字指向同一份列表,改一边另一边也会变,需要独立副本时用 copy() 或切片 a[:]

Python 列表复制与别名示例运行
a = [1, 2, 3]
b = a            # 不是复制,是别名
b.append(4)
print(a)         # [1, 2, 3, 4]  a 也变了

c = a.copy()     # 真正的浅拷贝
c.append(5)
print(a, c)      # [1, 2, 3, 4] [1, 2, 3, 4, 5]

综合练一练

循环读入用户输入的数字存进列表,输入 0 结束,最后输出总和、最大值,以及去重后的列表。