python--数据维度与数据格式化

78 阅读4分钟

一、数据维度:从 “线” 到 “体” 的数据形态

数据维度本质是 “定位一个元素需要几个索引”,可以用生活化的比喻理解:

  • 一维:像一根线,只有 “前后” 方向,1 个索引就能找到元素;
  • 二维:像一张纸(表格),需要 “行 + 列”2 个索引定位;
  • 多维:像一个魔方,需要 3 个及以上索引(如长 × 宽 × 高)定位。

1. 一维数据(1D)

最基础的维度,Python 中常用列表、元组、一维数组表示,仅需 1 个索引访问元素。

# 示例:存储班级学生姓名(一维列表)
names = ["张三", "李四", "王五"]

# 访问元素:索引从0开始
print(names[0])  # 输出:张三
print(names[-1]) # 输出:王五(倒数第一个)

# 遍历一维数据
for name in names:
    print(f"学生:{name}")

应用场景:存储单列数据(如成绩、手机号、商品名称)。

2. 二维数据(2D)

类似 Excel 表格,Python 中常用嵌套列表、二维数组、Pandas DataFrame表示,需 2 个索引(行 + 列)访问元素。

# 示例:存储学生姓名+语文/数学成绩(二维列表)
student_scores = [
    ["张三", 90, 88],  # 第0行:姓名、语文、数学
    ["李四", 85, 92],  # 第1行
    ["王五", 95, 80]   # 第2行
]

# 访问元素:行索引 + 列索引
print(student_scores[1][0])  # 第1行第0列:李四
print(student_scores[2][2])  # 第2行第2列:80(王五的数学成绩)

# 遍历二维数据(按行遍历)
for row in student_scores:
    name, chinese, math = row  # 解包每行数据
    print(f"{name}:语文{chinese},数学{math}")

应用场景:存储表格型数据(如学生信息表、销售清单)。

3. 多维数据(3D+)

三维及以上数据,常见于图像(宽 × 高 × 颜色通道)、时空数据(时间 × 地点 × 指标)等场景,Python 中常用numpy 多维数组实现(嵌套列表可读性差,不推荐)。

python

运行

import numpy as np

# 示例:三维数组(2个班级 × 3个学生 × 2门成绩)
class_scores = np.array([
    [[90, 88], [85, 92], [95, 80]],  # 1班:3个学生的语文/数学成绩
    [[88, 91], [79, 85], [92, 87]]   # 2班
])

# 访问元素:班级索引 + 学生索引 + 科目索引
print(class_scores[0][1][1])  # 1班第2个学生的数学成绩:92
print(class_scores.shape)     # 查看维度:(2, 3, 2) → 232

维度转换小技巧(新手常用)

numpy.reshape可快速转换数据维度(一维↔二维↔多维):

# 一维数组转二维(3行2列)
arr1d = np.array([1,2,3,4,5,6])
arr2d = arr1d.reshape(3, 2)
print(arr2d)
# 输出:
# [[1 2]
#  [3 4]
#  [5 6]]

二、数据格式化:让数据 “规范又好看”

数据格式化是将数据按指定规则展示(如字符串拼接)或存储(如 JSON/CSV),核心分两类:字符串格式化(输出展示)、数据结构格式化(存储 / 传输)。

1. 字符串格式化(最常用)

目的:将变量 / 数据嵌入字符串,规范输出格式,Python 有 3 种主流方式(推荐优先用 f-string)。

方式语法示例特点
% 格式化(老式)"姓名:%s,成绩:%.1f" % (name, score)兼容性好,语法稍繁琐
str.format()"姓名:{},成绩:{:.1f}".format(name, score)通用,支持参数定位
f-string(Python3.6+)f"姓名:{name},成绩:{score:.1f}"最简洁、高效,新手首选
# 实战示例:三种方式对比
name = "张三"
score = 90.5

# 1. %格式化
print("姓名:%s,成绩:%.1f" % (name, score))  # 输出:姓名:张三,成绩:90.5

# 2. str.format()
print("姓名:{},成绩:{:.1f}".format(name, score))  # 输出同上

# 3. f-string(推荐)
print(f"姓名:{name},成绩:{score:.1f}")  # 输出同上

2. 数据结构格式化(存储 / 传输)

将 Python 原生数据(列表 / 字典)转换为 JSON、CSV 等通用格式,方便存储到文件或传输给接口。

示例 1:字典转 JSON(接口数据常用)

JSON 是跨语言的通用数据格式,需导入json模块:

import json

# 原始Python字典
student = {
    "name": "张三",
    "age": 18,
    "scores": {"chinese": 90, "math": 88}
}

# 字典转JSON字符串(ensure_ascii=False显示中文,indent=2格式化缩进)
json_str = json.dumps(student, ensure_ascii=False, indent=2)
print(json_str)
# 输出:
# {
#   "name": "张三",
#   "age": 18,
#   "scores": {
#     "chinese": 90,
#     "math": 88
#   }
# }

# JSON字符串转回字典
student_dict = json.loads(json_str)
print(student_dict["scores"]["math"])  # 输出:88

示例 2:二维列表转 CSV(Excel 兼容)

CSV 是表格型数据的轻量格式,需导入csv模块:

import csv

# 二维数据(表头+内容)
data = [
    ["姓名", "语文", "数学"],
    ["张三", 90, 88],
    ["李四", 85, 92]
]

# 写入CSV文件(newline=""避免空行,encoding="utf-8"支持中文)
with open("student_scores.csv", "w", encoding="utf-8", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)  # 批量写入所有行

# 读取CSV文件
with open("student_scores.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)  # 输出每行数据(列表形式)
# 输出:
# ['姓名', '语文', '数学']
# ['张三', '90', '88']
# ['李四', '85', '92']

总结

  1. 数据维度:一维(单索引,如列表)、二维(行 + 列索引,如嵌套列表)、多维(多索引,如 numpy 数组)是核心形态,维度转换可借助numpy.reshape
  2. 字符串格式化:优先使用f-string,简洁高效,%.1f等格式符可控制数值精度;
  3. 数据结构格式化:JSON 适合接口传输,CSV 适合表格存储,转换时需注意编码(如utf-8)和格式参数(如indent)。