菜鸟科技网

flatten命令如何使用?

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

flatten命令如何使用?-图1
(图片来源网络,侵删)
  1. 编程/脚本:处理嵌套的列表、数组或 JSON 数据。
  2. 命令行:处理多行文本,将它们合并到一行。
  3. 数据库:将多行记录合并到一行。
  4. 电子表格:将多列数据合并到一列。

下面我将从这几个方面,结合具体的命令和工具来解释如何实现“扁平化”操作。


在编程/脚本中的 flatten

这是最常见的场景,你有一个嵌套的列表,你想把它变成一个单层的列表。

Python

Python 没有一个内置的 flatten 函数,但有多种简单的方法可以实现。

使用 itertools.chain (高效,推荐)

flatten命令如何使用?-图2
(图片来源网络,侵删)
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 中,处理数组扁平化非常方便。

flatten命令如何使用?-图3
(图片来源网络,侵删)

使用 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]

使用 reduceconcat (经典方法)

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_CONCATstring_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 都支持)

这是更强大、更通用的方法,尤其适用于大数据量。

  1. 选择数据区域 -> 数据 -> 从表格/区域
  2. 在 Power Query 编辑器中,你会看到一个二维表。
  3. 选择所有列
  4. 右键点击列标题 -> 逆透视列 -> 仅逆透视列
  5. 操作完成后,你会得到一个两列的表(属性值和值)。
  6. 删除不需要的“属性值”列。
  7. 点击 转换 选项卡 -> 逆透视列 旁边的向下箭头,选择 逆透视其他列
  8. 你将得到一个只包含“值”列的单列表,这就是扁平化后的数据。

场景 工具/方法 核心思想
编程 Python (itertools.chain), JS (flat()) 遍历嵌套结构,将子元素提取到新的一维结构中。
命令行 tr, paste, awk 删除或替换换行符 \n,将多行合并为一行。
数据库 GROUP_CONCAT (MySQL), string_agg (PG) GROUP BY 分组,使用聚合函数将多行字符串连接起来。
电子表格 FLATTEN 函数 (Google Sheets), Power Query 将二维区域的值提取到一个一维列或行中。

flatten 是一个核心的数据处理概念,理解它在不同环境下的实现方式,会让你在处理数据时事半功倍。

分享:
扫描分享到社交APP
上一篇
下一篇