使用带if的列表推导式创建无重复字符列表的问题排查
问题原因及解决方法
原代码问题分析
你写的列表推导式里,letter not in letter_list判断的是初始的letter_list(也就是[""]),而不是推导过程中正在构建的新列表。因为列表推导式是先完整计算出所有符合条件的元素,再把整个结果赋值给letter_list。所以只要字符不是空字符串,都会被加入,自然去不掉重复的字符。
正确解决方案
方法1:用集合去重(Python3.7+保持顺序)
集合天然会自动去重,而且Python3.7及以上版本的集合会保留元素首次出现的顺序,直接转成列表即可:
word_list = ['cat', 'dog', 'rabbit'] letter_list = list({letter for word in word_list for letter in word}) print(letter_list) # 输出: ['c', 'a', 't', 'd', 'o', 'g', 'r', 'b', 'i']
方法2:遍历+临时集合跟踪(严格控制顺序)
如果需要兼容更低版本Python,或者更清晰地控制逻辑,可以用普通循环搭配集合记录已出现的字符:
word_list = ['cat', 'dog', 'rabbit'] seen = set() letter_list = [] for word in word_list: for letter in word: if letter not in seen: seen.add(letter) letter_list.append(letter) print(letter_list) # 输出符合预期
方法3:带状态的列表推导式(Python3.8+)
如果一定要用列表推导式,可以利用集合的add方法(add返回None,配合not判断)实现:
word_list = ['cat', 'dog', 'rabbit'] seen = set() letter_list = [letter for word in word_list for letter in word if letter not in seen and not seen.add(letter)] print(letter_list)
内容的提问来源于stack exchange,提问作者Huy Trương Quang
相关产品推荐
相关产品推荐

