python 合并两个列表并去重

def merge_list(list1,list2): list_total=set(list1)+set(list2) return list_total if name=="main": list1=["hello","go","go"] list2 = ["o","yfj","jkj","go","hello","i"] print(merge_list(list1,list2)) 合并两个列表并去重 (用 集合(set) 来实现的,)

ChatGPT 说:

你这个代码的问题是 set(list1) + set(list2) 不能直接相加,因为 set 是不可直接用 + 运算符合并的(加号只适用于列表、字符串等可连接类型)。

如果你要用 集合去重 再合并,可以这样写:

ini 复制代码
python复制编辑def merge_list(list1, list2):
    list_total = set(list1) | set(list2)  # 用集合的并集运算
    return list_total

if __name__ == "__main__":
    list1 = ["hello", "go", "go"]
    list2 = ["o", "yfj", "jkj", "go", "hello", "i"]
    print(merge_list(list1, list2))

运行结果:

arduino 复制代码
bash复制编辑{'o', 'go', 'yfj', 'hello', 'i', 'jkj'}

解释

  • set(list1) 把列表转成集合,自动去掉重复元素

  • | 是集合的 并集 运算符,等价于 set(list1).union(set(list2))

  • 返回的结果是一个集合,元素是唯一的、无顺序的

如果你需要保留顺序 (比如第一次出现的顺序),那就不能直接用 set,要这样:

ini 复制代码
python复制编辑def merge_list(list1, list2):
    seen = set()
    result = []
    for item in list1 + list2:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

if __name__ == "__main__":
    list1 = ["hello", "go", "go"]
    list2 = ["o", "yfj", "jkj", "go", "hello", "i"]
    print(merge_list(list1, list2))

输出:

css 复制代码
css复制编辑['hello', 'go', 'o', 'yfj', 'jkj', 'i']

我建议如果只是去重合并,直接用 集合的并集 最快;

如果还要保顺序,就用"seen 集合 + 列表遍历"方式。

要不要我帮你画个列表去重合并的逻辑图,让你一下就记住?这样你以后就不用查了。

您说:

因为 set 是不可直接用 + 运算符合并的(加号只适用于列表、字符串等可连接类型)。 为什么set 不能用+合并,我不能理解

ChatGPT 说:
您说:

因为 set 是不可直接用 + 运算符合并的(加号只适用于列表、字符串等可连接类型)。 为什么set 不能用+合并,我不能理解

ChatGPT 说:

我给你拆开解释一下,你就明白了。

1. + 运算符是 Python 里"序列"的专属操作

  • 在 Python 里,+ 叫连接运算符(concatenation),它的设计目标是把两个"有顺序的"序列(list、tuple、str)接到一起。

  • listtuplestr 都是有序 的,+ 合并时能保证:

    arduino 复制代码
    csharp复制编辑[1, 2] + [3, 4] → [1, 2, 3, 4]
    "ab" + "cd" → "abcd"

2. set 是"无序集合"

  • set 没有顺序的概念,Python 不能保证你放进去的元素顺序,所以就没有提供 + 运算。

  • 如果给了 +,那两个集合合并后的"顺序"该怎么算?Python 设计者觉得不明确,所以干脆不支持。

3. 集合合并用并集运算

  • set 的数学定义是集合运算,所以它用:

    • |(竖线)做并集

    • & 做交集

    • - 做差集

  • 这才是数学上集合的"合并方式",而不是像列表那样接在一起。

4. 例子

ini 复制代码
python复制编辑a = {1, 2}
b = {2, 3}

# 不能这样
# a + b  ❌ 会报错 TypeError

# 应该这样
print(a | b)  # 并集 {1, 2, 3}
print(a.union(b))  # 另一种写法 {1, 2, 3}

总结

  • + 是序列的连接符 → 需要有顺序

  • set 是无序的集合 → 不适用 +,用 | 代表数学并集

相关推荐
野犬寒鸦1 小时前
力扣hot100:缺失的第一个正数(哈希思想)(41)
java·数据结构·后端·算法·leetcode·哈希算法
重生成为编程大王2 小时前
Java中使用JSONUtil处理JSON数据:从前端到后端的完美转换
java·后端·json
天若有情6733 小时前
《JAVA EE企业级应用开发》第一课笔记
java·笔记·后端·java-ee·javaee
技术小泽4 小时前
Redis-底层数据结构篇
数据结构·数据库·redis·后端·性能优化
lypzcgf5 小时前
Coze源码分析-工作空间-资源查询-后端源码
人工智能·后端·系统架构·开源·go
Funcy5 小时前
XxlJob源码分析02:admin启动流程
后端
一只叫煤球的猫5 小时前
Java实战:一个类让Java也用上JS的async/await
java·后端·性能优化
程序猿毕设源码分享网6 小时前
springboot医院信管系统源码和论文
java·spring boot·后端
桦说编程8 小时前
数据丢失,而且不抛出并发异常,多线程使用HashMap踩坑
java·数据结构·后端
颜如玉8 小时前
Redis主从同步浅析
后端·开源·源码