flatten 命令并不是一个标准的、通用的 Unix/Linux 命令(如 ls, cd, grep),而是一个概念,指将多维结构的数据转换为一维(扁平化)结构的操作,这个概念在许多领域都非常重要,包括:

- 编程/脚本:处理嵌套的列表、数组或 JSON 数据。
- 命令行:处理多行文本,将它们合并到一行。
- 数据库:将多行记录合并到一行。
- 电子表格:将多列数据合并到一列。
下面我将从这几个方面,结合具体的命令和工具来解释如何实现“扁平化”操作。
在编程/脚本中的 flatten
这是最常见的场景,你有一个嵌套的列表,你想把它变成一个单层的列表。
Python
Python 没有一个内置的 flatten 函数,但有多种简单的方法可以实现。
使用 itertools.chain (高效,推荐)

import itertools # 嵌套列表 nested_list = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] # 使用 itertools.chain.from_iterable 进行扁平化 flattened_list = list(itertools.chain.from_iterable(nested_list)) print(flattened_list) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
使用列表推导式 (简洁,Pythonic)
nested_list = [[1, 2, 3], [4, 5], [6, 7, 8, 9]] flattened_list = [item for sublist in nested_list for item in sublist] print(flattened_list) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
递归函数 (处理任意深度的嵌套)
如果列表的嵌套层数不确定,可以使用递归。
def deep_flatten(lst):
result = []
for item in lst:
if isinstance(item, list):
result.extend(deep_flatten(item))
else:
result.append(item)
return result
very_nested_list = [1, [2, [3, [4]], 5]]
flattened_list = deep_flatten(very_nested_list)
print(flattened_list)
# 输出: [1, 2, 3, 4, 5]
JavaScript (ES6)
JavaScript 中,处理数组扁平化非常方便。

使用 flat() 方法 (最现代、最简单)
const nestedArray = [1, [2, 3], [4, [5, 6]]]; // flat() 默认扁平一层 const flattenedOnce = nestedArray.flat(); console.log(flattenedOnce); // 输出: [1, 2, 3, 4, [5, 6]] // flat(Infinity) 扁平所有层级 const fullyFlattened = nestedArray.flat(Infinity); console.log(fullyFlattened); // 输出: [1, 2, 3, 4, 5, 6]
使用 reduce 和 concat (经典方法)
const nestedArray = [1, [2, 3], [4, [5, 6]]]; const flattened = nestedArray.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatten(val) : val), []); console.log(flattened); // 输出: [1, 2, 3, 4, 5, 6]
在命令行中的 flatten
在命令行中,flatten 通常指的是将多行文本转换成单行文本,这通常是为了方便其他命令处理。
工具 1: tr (Translate or Delete Characters)
tr 可以用来删除换行符 \n。
# 假设有一个文件 lines.txt,内容如下: # Hello # World # This is a test # 使用 tr 将换行符替换为空格 cat lines.txt | tr '\n' ' ' # 输出: Hello World This is a test # 如果想用逗号分隔 cat lines.txt | tr '\n' ',' # 输出: Hello,World,This is a test,
工具 2: paste (Merge lines of files)
paste 默认用制表符 \t 连接多行。
# 使用 -d 选项指定分隔符为逗号 paste -sd, lines.txt # 输出: Hello,World,This is a test
工具 3: awk (强大的文本处理工具)
awk 非常灵活,可以处理更复杂的场景。
# 将每行用空格连接,并去掉最后一个多余的空格 cat lines.txt | awk 'ORS=" "' | sed 's/ $//' # ORS (Output Record Separator) 设置为空格,sed 用来删除末尾的空格 # 输出: Hello World This is a test
在数据库中的 flatten
在 SQL 中,flatten 通常指将多行数据聚合到单个单元格中,这通常使用聚合函数和字符串处理函数来实现。
MySQL / PostgreSQL (使用 GROUP_CONCAT 或 string_agg)
假设有一个 orders 表:
| customer_id | product_name |
|-------------|--------------|
| 1 | Apple |
| 1 | Banana |
| 2 | Orange |
MySQL:
使用 GROUP_CONCAT。
SELECT
customer_id,
GROUP_CONCAT(product_name SEPARATOR ', ') AS products
FROM
orders
GROUP BY
customer_id;
结果: | customer_id | products | |-------------|------------------| | 1 | Apple, Banana | | 2 | Orange |
PostgreSQL:
使用 string_agg。
SELECT
customer_id,
string_agg(product_name, ', ') AS products
FROM
orders
GROUP BY
customer_id;
结果与 MySQL 相同。
SQL Server (使用 STRING_AGG)
SELECT
customer_id,
STRING_AGG(product_name, ', ') WITHIN GROUP (ORDER BY product_name) AS products
FROM
orders
GROUP BY
customer_id;
在电子表格(如 Excel / Google Sheets)中的 flatten
在 Excel 或 Google Sheets 中,你可以使用公式或 Power Query 来扁平化数据。
使用公式 (FLATTEN 函数 - Google Sheets)
Google Sheets 有一个专门的 FLATTEN 函数,非常方便。
假设你的数据在 A1:C3:
[ A1, B1, C1 ]
[ A2, B2, C2 ]
[ A3, B3, C3 ]
在任意一个空白单元格输入:
=FLATTEN(A1:C3)
结果会是一个单列,包含 A1:C3 区域内的所有值。
使用 Power Query (Excel 和 Google Sheets 都支持)
这是更强大、更通用的方法,尤其适用于大数据量。
- 选择数据区域 -> 数据 -> 从表格/区域。
- 在 Power Query 编辑器中,你会看到一个二维表。
- 选择所有列。
- 右键点击列标题 -> 逆透视列 -> 仅逆透视列。
- 操作完成后,你会得到一个两列的表(属性值和值)。
- 删除不需要的“属性值”列。
- 点击 转换 选项卡 -> 逆透视列 旁边的向下箭头,选择 逆透视其他列。
- 你将得到一个只包含“值”列的单列表,这就是扁平化后的数据。
| 场景 | 工具/方法 | 核心思想 |
|---|---|---|
| 编程 | Python (itertools.chain), JS (flat()) |
遍历嵌套结构,将子元素提取到新的一维结构中。 |
| 命令行 | tr, paste, awk |
删除或替换换行符 \n,将多行合并为一行。 |
| 数据库 | GROUP_CONCAT (MySQL), string_agg (PG) |
按 GROUP BY 分组,使用聚合函数将多行字符串连接起来。 |
| 电子表格 | FLATTEN 函数 (Google Sheets), Power Query |
将二维区域的值提取到一个一维列或行中。 |
flatten 是一个核心的数据处理概念,理解它在不同环境下的实现方式,会让你在处理数据时事半功倍。
