Python代码疑问:统计两字符串字符组合去重后的数量
代码运行逻辑拆解与问题分析
首先先把你的代码贴出来方便对照:
word3="helloworldnicetomeetyou" word4="munameispythonson" a=[i+j for i in word3 for j in word4] a.sort() b=0 while(b<=391): if ("a[int(b)]" is "a[int(b)+1]"): del a[b] else: b = b+1 print(len(a))
我来逐行给你拆解运行逻辑,同时指出里面的关键问题:
1. 生成所有两两字符组合
前两行定义了两个源字符串word3和word4。
第三行的列表推导式[i+j for i in word3 for j in word4]是组合生成的核心:它会先遍历word3里的每一个字符i,再对应遍历word4里的每一个字符j,把i和j拼接成2字符字符串,所有组合都会被放进列表a里。你说的“两字符串字符总数相乘为391种组合”就是这里的初始列表长度,这个逻辑是对的。
2. 排序为去重做准备
第四行a.sort()把所有2字符组合按字典序排序,目的是让相同的组合挨在一起——这样后面只要检查相邻元素,就能快速判断是否重复,这个思路是没问题的。
3. 循环去重的逻辑(这里有致命坑!)
接下来的循环是代码的核心,但也存在关键错误:
- 初始化
b=0,用它作为列表a的索引来逐个遍历元素。 - 循环条件
while(b<=391):这里有隐患,初始列表长度是391,索引范围是0到390,当b=391时访问a[b]会触发索引越界,不过你说代码无报错,大概率是因为判断逻辑的问题,b还没到391就退出循环了。 - 最关键的判断语句
if ("a[int(b)]" is "a[int(b)+1]"):你把列表元素的获取方式写错了!"a[int(b)]"是一个固定的字符串字面量(内容就是a[int(b)]),不是去取列表a中索引为b的元素。同理"a[int(b)+1]"也是固定字符串,这两个字符串显然不一样,所以这个判断永远是False,导致del a[b]永远不会执行,b每次都会加1直到循环结束。 - 因为删除操作从未触发,最后
print(len(a))输出的还是初始的391,根本没实现去重的目的!
4. 修正与优化建议
方法一:修正循环去重的代码
把判断语句改成正确的元素获取方式,同时修正循环条件避免索引越界:
word3="helloworldnicetomeetyou" word4="munameispythonson" a=[i+j for i in word3 for j in word4] a.sort() b=0 while b < len(a)-1: # 循环条件改为b小于列表长度减1,避免访问a[b+1]时越界 if a[b] == a[b+1]: # 直接取列表元素,用==比较字符串内容(is更适合比较身份而非内容) del a[b] # 删除重复元素后,后面元素会前移,所以b不用加1 else: b += 1 print(len(a))
方法二:用集合实现更高效的去重
Python的集合(set)天生会自动去除重复元素,性能比排序+循环去重更好,代码也更简洁:
word3="helloworldnicetomeetyou" word4="munameispythonson" # 生成所有组合的集合,自动完成去重 unique_combinations = set(i + j for i in word3 for j in word4) print(len(unique_combinations))
这个写法一行就能完成核心逻辑,不需要排序和循环,非常推荐。
内容的提问来源于stack exchange,提问作者Jamie Son
相关产品推荐
相关产品推荐

