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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:41