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

Python中list与dict的区别及推导式输出差异解析

Python列表(list)与集合(set)的区别及代码输出差异解析

嘿,我来帮你把这里的知识点掰扯清楚——首先得纠正一个小误解:你写的第二个推导式不是字典推导式,而是集合推导式!接下来咱们一步步拆解核心区别和输出差异的原因:

一、列表与集合的核心差异

先把基础概念理明白:

  • 列表(list):用方括号[]定义,是有序、允许重复元素的容器。它会严格保留你添加元素的顺序,哪怕元素完全一样也会全部存储。
  • 集合(set):用大括号{}定义(注意空集合必须用set(),因为{}默认是空字典),是无序、自动去重的容器,而且里面的元素必须是可哈希的(比如字符串、数字这类不可变类型)。
  • 至于字典(dict),它是键值对结构,推导式需要写成{key: value for ...}的形式,和你写的第二个代码完全不同哦。

二、两个代码示例的输出差异解析

示例1:列表推导式

MORSE = [".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."]
seen = ["".join(MORSE[ord(c) - ord('a')] for c in word) for word in words]

输出结果:['--...-.', '--...-.', '--...--.', '--...--.']
这个推导式会遍历words中的每一个单词,把每个单词转换成对应的摩尔斯码字符串,然后按原顺序把所有结果都存进列表里。哪怕有重复的摩尔斯码(比如words里有两个单词转出来都是--...-.),列表也会毫无保留地把重复项都保留下来,所以你看到输出里有两组重复的元素。

示例2:集合推导式

{"".join(MORSE[ord(c) - ord('a')] for c in word) for word in words}

输出结果:{'--...-.', '--...--.'}
集合的核心特性就是自动去重——不管你往集合里添加多少次相同的元素,最终只会保留一个唯一的实例。所以这个推导式在转换每个单词的摩尔斯码后,会自动剔除重复的结果,只留下所有唯一的摩尔斯码字符串。另外集合是无序的,所以输出的元素顺序可能和原列表的顺序不一样(不过这里只有两个元素,差异不明显)。

补充:真正的字典推导式示例

怕你混淆,顺便给个字典推导式的例子:如果想把单词和对应的摩尔斯码做成键值对,可以这么写:

word_morse_map = {word: "".join(MORSE[ord(c) - ord('a')] for c in word) for word in words}

这样得到的是一个字典,键是words里的单词(重复的单词会被后面的覆盖),值是对应的摩尔斯码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:40:41