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 小时前
扫码点餐小程序产品需求分析与功能梳理
前端·javascript·后端
Java技术小馆1 小时前
PromptPilot打造高效AI提示词
java·后端·面试
陈陈陈同学242 小时前
Vercel迁移到Dokploy自部署,每月立省20刀
后端·node.js
倔强的皮皮虾2 小时前
sharding proxy 实战读写分离,分库分表
后端
ONE_Gua2 小时前
魔改chromium源码——解除 iframe 的同源策略
前端·后端·浏览器
现在没有牛仔了2 小时前
举例说明什么是Redis缓存击穿,以及如何解决。
java·redis·后端
wave7772 小时前
spring的bean加载方式-如何解决循环依赖-什么是三级缓存-源码走读
后端
倔强的皮皮虾2 小时前
docker + jenkins 自动化部署
后端
用户1512905452203 小时前
JSON字符串和java对象的互转【json-lib】
后端
用户1512905452203 小时前
Abp VNext 入门——让ABP跑起来
后端