Set与数组本质不同:数组有序、可重复、支持索引;Set无序、自动去重、不支持索引。转换需明确目的——去重提速用set(),保留顺序用dict.fromkeys(),转数组则依需求选list、np.array或array.array。

Set 和数组(通常指 Python 中的 list)本质不同:数组有序、可重复、支持索引;Set 无序、自动去重、不支持索引。相互转换不是简单“格式变化”,而是数据形态和用途的切换,关键在理解目的再选方法。
数组转 Set:核心是去重与提速查找
用 set() 函数最直接,它会自动丢弃重复项,并将结果转为哈希结构,后续成员判断(in)平均时间复杂度从 O(n) 降到 O(1)。
- 基础写法:
my_set = set([1, 2, 2, 3, 4, 4])→{1, 2, 3, 4} - 注意:原数组元素必须是不可变类型(如 int、str、tuple),含 list 或 dict 会报错
- 如果只是临时去重且后续还要保持顺序,别直接用 set(),后面有替代方案
Set 转数组:重点在明确你要什么“数组”
Python 没有单一“数组”类型,常见有三种目标:
-
普通列表(list):用
list(my_set)。结果无序,每次运行可能顺序不同 -
NumPy 数组:需先转 list 再进 numpy,
np.array(list(my_set)),适合数值计算 -
标准库 array(紧凑型):如
array.array('i', my_set),要求元素类型统一且为基本数值类型
保留顺序的去重:不要只盯 set
单纯 set(arr) 会丢失原始顺序。若需“去重但保持首次出现顺序”,推荐:
- Python 3.7+:用字典去重法
list(dict.fromkeys(arr)) - 或手动遍历 + set 记录已见元素,边查边追加到新列表
- 第三方库如 pandas 可用
pd.Series(arr).drop_duplicates().tolist()
实际用例中常混用,别硬套转换
比如求两个列表的共同元素,不必先各自转 set 再交集,可直接写:set(list_a) & set(list_b);想合并去重并排序,写成 sorted(set(list_a + list_b)) 更自然。转换只是手段,目标才是关键。

















