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 是无序的集合 → 不适用 +,用 | 代表数学并集

相关推荐
桦说编程2 小时前
简单方法实现子任务耗时统计
java·后端·监控
盖世英雄酱581362 小时前
物品超领取损失1万事故复盘(一)
java·后端
凌览2 小时前
别再死磕 Nginx!http-proxy-middleware 低配置起飞
前端·后端
拾玖不会code2 小时前
简单分表场景下的业务发散思考:分表如何保证丝滑?
后端
CryptoRzz2 小时前
印度尼西亚(IDX)股票数据对接开发
java·后端·websocket·web3·区块链
咕白m6253 小时前
通过 C# 快速生成二维码 (QR code)
后端·.net
踏浪无痕3 小时前
架构师如何学习 AI:三个月掌握核心能力的务实路径
人工智能·后端·程序员
小毅&Nora3 小时前
【后端】【SpringBoot】① 源码解析:从启动到优雅关闭
spring boot·后端·优雅关闭
嘻哈baby3 小时前
从TIME_WAIT爆炸到端口耗尽:Linux短连接服务排查与优化
后端
开心就好20253 小时前
iOS应用性能监控全面解析:CPU、内存、FPS、卡顿与内存泄漏检测
后端