You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Polars是否不区分元组与列表?转元组是否无意义?

Polars中列表与元组的处理差异及.map_elements(tuple)的作用分析

一、Polars对列表与元组的统一处理逻辑

Polars的类型系统中不单独区分元组和列表:当你传入元组作为DataFrame的列值时,Polars会自动将其转换为list类型存储。这就是测试代码中dftuple_pl.equals(dflist_pl)返回True的核心原因——两者的底层存储类型和内容完全一致。

从输出结果也能验证这一点:无论用元组还是列表创建DataFrame,列的类型都是list[str],执行unique()后的结果也完全相同。

测试代码:

import polars as pl

dftuple_pl = pl.DataFrame({"col1": [("a", "a"), ("a", "a")],
                           "col2": [("b", "b"), ("b", "b")]})

dflist_pl = pl.DataFrame({"col1": [["a", "a"], ["a", "a"]],
                          "col2": [["b", "b"], ["b", "b"]]})

print(dftuple_pl.equals(dflist_pl))
# True

print(dftuple_pl.unique())
# shape: (1, 2)
# ┌────────────┬────────────┐
# │ col1       ┆ col2       │
# │ ---        ┆ ---        │
# │ list[str]  ┆ list[str]  │
# ╞════════════╪════════════╡
# │ ["a", "a"] ┆ ["b", "b"] │
# └────────────┴────────────┘

print(dflist_pl.unique())
# shape: (1, 2)
# ┌────────────┬────────────┐
# │ col1       ┆ col2       │
# │ ---        ┆ ---        │
# │ list[str]  ┆ list[str]  │
# ╞════════════╪════════════╡
# │ ["a", "a"] ┆ ["b", "b"] │
# └────────────┴────────────┘

二、与Pandas的核心差异

Pandas严格区分元组和列表的特性:

  • 元组是不可变序列,具备可哈希性,因此可以直接用于drop_duplicates()去重;
  • 列表是可变序列,不可哈希,执行去重操作会抛出TypeError: unhashable type: 'list'。

测试代码:

import pandas as pd

dftuple_pd = pd.DataFrame({"col1": [("a", "a"), ("a", "a")],
                           "col2": [("b", "b"), ("b", "b")]})

dflist_pd = pd.DataFrame({"col1": [["a", "a"], ["a", "a"]],
                          "col2": [["b", "b"], ["b", "b"]]})

print(dftuple_pd.equals(dflist_pd))
# False

print(dftuple_pd.drop_duplicates())
#      col1    col2
# 0  (a, a)  (b, b)

print(dflist_pd.drop_duplicates())
# TypeError: unhashable type: 'list'

三、Polars中.map_elements(tuple)的作用分析

在Polars中,这个操作本质上无用,原因如下:

  1. Polars不支持单独的元组类型:即使你通过map_elements(tuple)将列表转换为元组,Polars会立刻将其重新解析为list类型存储,最终列的类型和内容与原列完全一致;
  2. Polars的list类型本身支持基于元素内容和顺序的相等性判断、去重等操作,不需要依赖元组的可哈希性——这和Pandas的逻辑完全不同,你不需要将列表转成元组就能实现去重。

内容的提问来源于stack exchange,提问作者gernophil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 15:47:31