当前位置:首页 > 技术 > 正文内容

Python 列表详解:可变有序序列的操作与实践

访客 技术 2026年8月25日 1

列表(list)是 Python 中最常用的数据结构之一,它是一种**有序、可变、允许重复元素**的容器,能够存储任意类型的对象(如整数、字符串、布尔值、甚至其他列表或字典)。与元组(tuple)不同,列表支持在运行时动态增删改查,适用于需要频繁修改数据集合的场景。

1. 创建与初始化

列表使用方括号 [] 定义,元素之间用逗号分隔。空列表可直接写作 [],也可通过构造函数 list() 创建:

# 直接定义
mixed_items = [42, "hello", True, 3.14, None]
empty_list = []

# 使用构造函数(常用于将其他可迭代对象转为列表)
chars = list("python")  # ['p', 'y', 't', 'h', 'o', 'n']
numbers = list(range(3))  # [0, 1, 2]

2. 核心操作方法

2.1 尾部追加:append()

向列表末尾添加单个元素,原地修改,不返回新列表(返回 None):

stack = []
stack.append("first")
stack.append("second")
print(stack)  # ['first', 'second']

2.2 批量扩展:extend()

将另一个可迭代对象(如列表、元组、字符串)的所有元素逐个添加到当前列表末尾:

fruits = ["apple", "banana"]
fruits.extend(["cherry", "date"])
print(fruits)  # ['apple', 'banana', 'cherry', 'date']

# 等价于手动循环调用 append()
for item in ["cherry", "date"]:
    fruits.append(item)

2.3 指定位置插入:insert(index, value)

在索引 index 处插入新元素;若 index 超出范围,则自动插入到末尾(正向越界)或开头(负向越界):

tasks = ["review code", "write tests"]
tasks.insert(0, "setup env")     # ['setup env', 'review code', 'write tests']
tasks.insert(10, "deploy")       # 插入到末尾 → ['setup env', 'review code', 'write tests', 'deploy']

2.4 值匹配删除:remove(value)

从左至右查找并移除第一个匹配的元素;若不存在则抛出 ValueError

scores = [85, 92, 78, 92, 88]
scores.remove(92)  # 移除首个 92
print(scores)      # [85, 78, 92, 88]

# 安全删除模式
if 100 in scores:
    scores.remove(100)

2.5 索引定位删除:pop([index])

移除并返回指定索引处的元素;默认移除最后一个(pop()),常用于实现栈(LIFO)行为:

queue = ["Alice", "Bob", "Charlie"]
first_served = queue.pop(0)  # 队列式服务(FIFO)
print(first_served)          # Alice
print(queue)                 # ['Bob', 'Charlie']

last_item = queue.pop()      # 栈式弹出
print(last_item)             # Charlie

2.6 清空全部:clear()

移除列表中所有元素,使其长度变为 0:

cache = [1, 2, 3, 4, 5]
cache.clear()
print(cache)  # []

2.7 查找索引:index(value, [start, end])

返回首次出现该值的索引;可选参数限制搜索范围;未找到则报错:

data = ["a", "b", "c", "b", "d"]
pos = data.index("b")        # 1
pos2 = data.index("b", 2)    # 3(从索引2开始查找)

2.8 排序:sort(key=None, reverse=False)

对列表进行原地排序,默认升序;支持自定义键函数和降序排列。注意:仅适用于同质类型(如全数字或全字符串):

ages = [28, 35, 22, 41]
ages.sort()                    # [22, 28, 35, 41]
ages.sort(reverse=True)        # [41, 35, 28, 22]

names = ["Zoe", "alice", "Bob"]
names.sort(key=str.lower)      # 忽略大小写排序 → ['alice', 'Bob', 'Zoe']

2.9 反转顺序:reverse()

原地反转列表元素顺序:

order = ["start", "middle", "end"]
order.reverse()
print(order)  # ['end', 'middle', 'start']

3. 实用案例

3.1 动态用户注册系统

registered_users = []
while True:
    username = input("请输入用户名(输入 'quit' 结束): ").strip()
    if not username or username.lower() == "quit":
        break
    if username not in registered_users:
        registered_users.append(username)
        print(f"✅ 已注册:{username}")
    else:
        print("⚠️ 用户名已存在,请重试")

print(f"当前共 {len(registered_users)} 名用户:{registered_users}")

3.2 抽奖管理系统(带去重与状态反馈)

import random

prizes = ["iPhone 15", "AirPods", "MacBook", "iPad", "Watch"]
participants = ["李明", "王芳", "张伟", "陈静"]

random.shuffle(participants)  # 打乱顺序确保公平性

winners = []
for i, person in enumerate(participants[:len(prizes)]):
    prize = prizes[i]
    winners.append((person, prize))
    print(f"🎉 {person} 抽中 {prize}")

# 输出结果
for name, award in winners:
    print(f"获奖者:{name} —— 奖品:{award}")

4. 注意事项

  • 列表是可变对象,赋值时传递的是引用而非副本(如需复制请使用 copy() 或切片 [:]);
  • 混合类型列表虽合法,但会限制部分操作(如 sort())的可用性;
  • 高频插入/删除头部元素建议改用 collections.deque 提升性能;
  • 大量数据筛选推荐使用列表推导式或 filter(),比循环 + remove() 更高效。

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。