🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

掌握Python集合!列表与字典从入门到精通详解

要在电脑上通过命令提示符或 PowerShell 运行 Python,需要先下载并安装 Python。
如果你还没有安装,请参考Python安装与开发环境配置一文来完成安装。

在网站制作和应用程序开发中,有很多场景需要高效地处理多个数据,对吧?例如,博客文章列表、电商网站的商品列表、用户信息等,这些都是“数据集”。Python为此提供了一种强大的机制来智能地管理这些数据集,那就是“集合 (Collection)”。

本文将重点介绍Python集合中特别重要的“列表 (List)”和“字典 (Dictionary)”,通过大量可直接复制粘贴并运行的代码示例,为网页开发者初学者深入浅出地讲解从基础到应用的所有知识。来吧,让我们一起通过体验“可运行”的代码,提升数据操作的技能吧!

1. 按序排列数据的“列表” (List)

我们首先要学习的是“列表”。列表是能够按顺序存储多个数据的最基本的集合。顾名思义,它最适合处理顺序具有意义的数据,比如购物清单或待办事项列表。在网页制作中,它有助于管理导航菜单项、博客文章的标签列表、图片库的文件名列表等。

如何创建列表

创建列表非常简单。只需用方括号 [] 将数据括起来,并用逗号 , 分隔每个数据即可。你可以放入数字、字符串,甚至在列表中再放入另一个列表。

# 创建一个字符串列表
fruits = ["苹果", "香蕉", "橘子"]
print(fruits)

# 创建一个数字列表
numbers = [1, 2, 3, 4, 5]
print(numbers)

# 也可以混合不同数据类型
mixed_list = [1, "你好", True, 3.14]
print(mixed_list)

执行结果:

['苹果', '香蕉', '橘子']
[1, 2, 3, 4, 5]
[1, '你好', True, 3.14]

访问元素(索引)

要从列表中取出特定的数据(元素),需要使用一个叫做“索引 (Index)”的数字。需要注意的是,索引是从0开始的。第一个元素是 [0],第二个是 [1],以此类推。

fruits = ["苹果", "香蕉", "橘子"]

# 获取第一个元素 (索引为0)
first_fruit = fruits[0]
print(f"第一个水果: {first_fruit}")

# 获取第三个元素 (索引为2)
third_fruit = fruits[2]
print(f"第三个水果: {third_fruit}")

执行结果:

第一个水果: 苹果
第三个水果: 橘子

添加元素 (append)

要在列表末尾添加新元素,请使用 append() 方法。这就像在博客列表的最后添加一篇新文章一样。

fruits = ["苹果", "香蕉", "橘子"]
print(f"添加前: {fruits}")

# 在列表末尾添加 "葡萄"
fruits.append("葡萄")
print(f"添加后: {fruits}")

执行结果:

添加前: ['苹果', '香蕉', '橘子']
添加后: ['苹果', '香蕉', '橘子', '葡萄']

修改元素

你也可以通过指定索引来将现有元素的值更改为新值。

fruits = ["苹果", "香蕉", "橘子"]
print(f"修改前: {fruits}")

# 将第二个元素 (索引为1) 修改为 "猕猴桃"
fruits[1] = "猕猴桃"
print(f"修改后: {fruits}")

执行结果:

修改前: ['苹果', '香蕉', '橘子']
修改后: ['苹果', '猕猴桃', '橘子']

删除元素 (del)

要通过指定索引来删除元素,请使用 del 语句。

fruits = ["苹果", "香蕉", "橘子", "葡萄"]
print(f"删除前: {fruits}")

# 删除第三个元素 (索引为2)
del fruits[2]
print(f"删除后: {fruits}")

执行结果:

删除前: ['苹果', '香蕉', '橘子', '葡萄']
删除后: ['苹果', '香蕉', '葡萄']

获取列表长度 (len)

要了解列表中有多少个元素,len() 函数非常方便。例如,你可以用它来显示博客文章的总数。

fruits = ["苹果", "香蕉", "橘子", "葡萄"]
item_count = len(fruits)

print(f"列表中有 {item_count} 个元素。")

执行结果:

列表中有 4 个元素。

2. 用键和值管理的“字典” (Dictionary)

接下来要介绍的“字典 (Dictionary)”是在Web开发中非常常用且功能极其强大的数据结构。列表通过数字(索引)来管理数据,而字典则通过名为“键 (Key)”的名称与其对应的“值 (Value)”成对来管理数据。

它就像一个电话簿,将人名(键)和电话号码(值)配对。当不关心顺序,但希望通过键快速查找对应的值时,它是最佳选择。它非常适合管理网站的会员信息(用户名: "张三", 年龄: 25...)或配置信息(主题颜色: "#333", 字体大小: "16px"...)。

如何创建字典

字典使用花括号 {} 创建,并用逗号 , 分隔每个 键: 值 对。键通常使用字符串。

# 用字典创建用户信息
user = {
  "name": "张三",
  "age": 30,
  "email": "zhangsan@example.com",
  "is_admin": False
}

print(user)

执行结果:

{'name': '张三', 'age': 30, 'email': 'zhangsan@example.com', 'is_admin': False}

访问值(通过键)

要从字典中取值,需要使用“键”而不是列表的索引。写法类似于 字典名[键]

user = {
  "name": "张三",
  "age": 30,
  "email": "zhangsan@example.com"
}

# 获取键 "name" 对应的值
user_name = user["name"]
print(f"用户名: {user_name}")

# 获取键 "age" 对应的值
user_age = user["age"]
print(f"年龄: {user_age}")

执行结果:

用户名: 张三
年龄: 30

添加和更新值

在字典中添加新的键值对或更新现有键的值都很简单。为新键赋值即为添加,为现有键赋值即为更新。

user = {
  "name": "张三",
  "age": 30
}
print(f"操作前: {user}")

# 添加新键 "city"
user["city"] = "北京"
print(f"添加后: {user}")

# 更新现有键 "age" 的值
user["age"] = 31
print(f"更新后: {user}")

执行结果:

操作前: {'name': '张三', 'age': 30}
添加后: {'name': '张三', 'age': 30, 'city': '北京'}
更新后: {'name': '张三', 'age': 31, 'city': '北京'}

删除元素 (del)

与列表类似,你可以使用 del 语句和键来删除特定的键值对。

user = {
  "name": "张三",
  "age": 30,
  "email": "zhangsan@example.com"
}
print(f"删除前: {user}")

# 删除键 "email" 及其对应的值
del user["email"]
print(f"删除后: {user}")

执行结果:

删除前: {'name': '张三', 'age': 30, 'email': 'zhangsan@example.com'}
删除后: {'name': '张三', 'age': 30}

获取键或值的列表

如果你想获取字典中所有键或值的列表,keys()values()items() 等方法会很有用。

user = {
  "name": "张三",
  "age": 30,
  "city": "北京"
}

# 获取所有键
print(f"键的列表: {user.keys()}")

# 获取所有值
print(f"值的列表: {user.values()}")

# 获取所有键值对(作为元组的列表)
print(f"键值对: {user.items()}")

执行结果:

键的列表: dict_keys(['name', 'age', 'city'])
值的列表: dict_values(['张三', 30, '北京'])
键值对: dict_items([('name', '张三'), ('age', 30), ('city', '北京')])

3. 应用篇:用Python生成动态商品列表页面!

将我们学到的列表和字典结合起来,可以完成非常实用的操作。在这里,我们来看一个用Python管理电商网站的商品列表,并以此为基础自动生成HTML的例子。这是Web框架(如Django或Flask)内部工作的基础理念。

首先,我们将商品数据在Python中定义为“字典的列表”。每个商品都是一个字典,其中包含商品名、价格、图片文件名等信息。

<!-- 这是一个在Web服务器上运行以生成下方HTML的Python代码示例 -->
#
# import html
#
# # 商品数据列表(每个商品都是一个字典)
# products = [
#     {
#         "name": "有机棉T恤",
#         "price": 99,
#         "image": "tshirt.jpg",
#         "description": "这是一款触感舒适的100%有机棉T恤。"
#     },
#     {
#         "name": "帆布运动鞋",
#         "price": 199,
#         "image": "sneakers.jpg",
#         "description": "百搭的经典款帆布运动鞋,适合各种风格。"
#     },
#     {
#         "name": "皮革双肩包",
#         "price": 499,
#         "image": "backpack.jpg",
#         "description": "真皮双肩包,越用越有味道。"
#     }
# ]
#
# # 生成HTML
# html_content = ""
# for product in products:
#     # 不要忘记HTML转义
#     name_esc = html.escape(product["name"])
#     desc_esc = html.escape(product["description"])
#     img_esc = html.escape(product["image"])
#
#     html_content += f"""
# <div class="product-card">
#   <img src="images/{img_esc}" alt="{name_esc}">
#   <h3>{name_esc}</h3>
#   <p class="price">¥{product['price']:,}</p>
#   <p>{desc_esc}</p>
# </div>
# """
#
# # 将此html_content写入文件或传递给Web框架的模板
# # print(html_content)
#

运行上述Python代码会生成如下的HTML代码。在浏览器中打开它,商品列表就会显示出来。这种“将数据与视图分离”的思想是高效Web开发的关键。

👇可完整运行的HTML示例👇
复制以下代码,保存为名为products.html的文件,然后在浏览器中打开它。(※ 图片不会显示,但可以查看布局)

<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>商品列表</title>
  <style>
    body {
      font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
      background-color: #f4f7f6;
      color: #333;
      margin: 0;
      padding: 2rem;
    }
    .container {
      max-width: 1200px;
      margin: 0 auto;
    }
    h1 {
      text-align: center;
      color: #2c3e50;
      margin-bottom: 2rem;
    }
    .product-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
      gap: 2rem;
    }
    .product-card {
      background-color: #fff;
      border-radius: 8px;
      box-shadow: 0 4px 15px rgba(0,0,0,0.1);
      overflow: hidden;
      transition: transform 0.3s, box-shadow 0.3s;
    }
    .product-card:hover {
      transform: translateY(-5px);
      box-shadow: 0 8px 25px rgba(0,0,0,0.15);
    }
    .product-card img {
      width: 100%;
      height: 200px;
      object-fit: cover;
      background-color: #eee;
    }
    .product-card h3 {
      font-size: 1.25rem;
      margin: 1rem 1.5rem 0.5rem;
      color: #34495e;
    }
    .product-card .price {
      font-size: 1.2rem;
      font-weight: bold;
      color: #e74c3c;
      margin: 0 1.5rem;
    }
    .product-card p {
      font-size: 0.95rem;
      line-height: 1.6;
      margin: 0.5rem 1.5rem 1.5rem;
      color: #7f8c8d;
    }
  </style>
</head>
<body>

  <div class="container">
    <h1>推荐商品</h1>
    <div class="product-grid">
      
      <div class="product-card">
        <img src="images/tshirt.jpg" alt="有机棉T恤">
        <h3>有机棉T恤</h3>
        <p class="price">¥99</p>
        <p>这是一款触感舒适的100%有机棉T恤。</p>
      </div>
      
      <div class="product-card">
        <img src="images/sneakers.jpg" alt="帆布运动鞋">
        <h3>帆布运动鞋</h3>
        <p class="price">¥199</p>
        <p>百搭的经典款帆布运动鞋,适合各种风格。</p>
      </div>
      
      <div class="product-card">
        <img src="images/backpack.jpg" alt="皮革双肩包">
        <h3>皮革双肩包</h3>
        <p class="price">¥499</p>
        <p>真皮双肩包,越用越有味道。</p>
      </div>

    </div>
  </div>

</body>
</html>

4. 了解这些,让你与众不同!注意事项与选择

列表和字典非常方便,但有一些需要注意的地方。理解这些将有助于你进行更高级的编程并避免意外错误。

列表 vs 字典:如何选择?

即使在网站内容中,你也会自然而然地对顺序很重要的导航菜单项使用列表,而对希望通过“键”来管理的网站全局设置使用字典

注意列表的“复制”!

这是初学者容易掉入的陷阱之一。如果你简单地用 = 将一个列表赋给另一个变量,复制的不是列表本身,而是列表的“位置(引用)”。结果是,修改其中一个会导致另一个也发生变化。

# 错误的复制示例
list_a = [1, 2, 3]
list_b = list_a  # 这不是内容的复制!

print(f"修改前: list_a = {list_a}, list_b = {list_b}")

# 当你修改 list_b 时...
list_b.append(4)

# 奇怪的是,list_a 也变了!
print(f"修改后: list_a = {list_a}, list_b = {list_b}")

执行结果:

修改前: list_a = [1, 2, 3], list_b = [1, 2, 3]
修改后: list_a = [1, 2, 3, 4], list_b = [1, 2, 3, 4]

为了避免这种情况,请使用 copy() 方法创建一个完全独立的新列表。

# 正确的复制示例
list_a = [1, 2, 3]
list_c = list_a.copy() # 使用 copy() 方法

print(f"修改前: list_a = {list_a}, list_c = {list_c}")

# 即使你修改 list_c...
list_c.append(4)

# list_a 也不受影响!
print(f"修改后: list_a = {list_a}, list_c = {list_c}")

执行结果:

修改前: list_a = [1, 2, 3], list_c = [1, 2, 3]
修改后: list_a = [1, 2, 3], list_c = [1, 2, 3, 4]

5. 还有更多!其他方便的集合

除了列表和字典,Python还有其他方便的集合。这里简单介绍两种。

元组 (Tuple)

元组,简单来说,就是“不可修改的列表”。创建方法只是将列表的方括号 [] 改为圆括号 ()。一旦创建,就不能添加、修改或删除元素。因此,它适合管理程序执行过程中不希望被改变的数据,比如常量。

# 用元组定义RGB颜色代码
color_red = (255, 0, 0)
print(f"红色的RGB值: {color_red}")

# 访问第一个元素
print(f"R的值: {color_red[0]}")

# 尝试修改会引发错误
# color_red[0] = 200 # TypeError: 'tuple' object does not support item assignment

执行结果:

红色的RGB值: (255, 0, 0)
R的值: 255

集合 (Set)

集合是一个“不含重复值且无序的”集合。它像字典一样使用花括号 {},但只存储值,而不是键值对。它的主要用途是从列表中删除重复元素,或在多个列表之间查找共同或不同的元素。

# 包含重复元素的列表
numbers = [1, 2, 2, 3, 4, 4, 4, 5]
print(f"原始列表: {numbers}")

# 转换为集合以删除重复项
unique_numbers = set(numbers)
print(f"删除重复项后的集合: {unique_numbers}")

# 从集合转换回列表
unique_list = list(unique_numbers)
print(f"转换回列表后: {unique_list}")

执行结果:

原始列表: [1, 2, 2, 3, 4, 4, 4, 5]
删除重复项后的集合: {1, 2, 3, 4, 5}
转换回列表后: [1, 2, 3, 4, 5]

总结

这次,我们讲解了作为Python数据结构核心的“列表”和“字典”,从基本用法到Web开发中的应用示例。

熟练使用这些集合将极大地提高你在Python中的编程效率。特别是在Web开发领域,从数据库中检索数据并将其作为列表或字典处理以生成HTML,是基本流程。请务必亲手运行本文中的代码,感受“亲手操控数据”的乐趣!

下一步:
熟悉了数据处理之后,下一步就是学习如何从文件中读取数据以及如何将处理结果保存到文件中。下面的文章对此有详细的解释。
如何在Python中读写文件(输入/输出)