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
相关产品推荐
相关产品推荐

