统计共享字符最大出现次数时,for循环填充字典异常终止问题求助
问题说明
我有两个字符串:
s1 = "Are they here" s2 = "yes, they are here"
想要创建一个字典e,以共享字符在两个字符串中的最大出现次数为键,对应字符为值(例如,字符'y'在s1中出现1次,在s2中出现2次,字典中应包含{2:'y'}这样的键值对,以此类推)。
我的实现思路:
- 先创建列表
c收集所有共享字符:
c = ['r', 'e', 't', 'h', 'e', 'y', 'h', 'e', 'r', 'e', 'y', 'e', 't', 'h', 'e', 'y', 'r', 'e', 'h', 'e', 'r', 'e']
- 转换为集合
d去除重复项,作为迭代对象:
d = {'h', 'y', 'r', 't', 'e'}
- 通过for循环遍历
d填充字典e,记录每个字符的最大出现次数。
以下是完整代码(注:不想使用任何库,且字典推导式可以正常工作):
def mix(s1, s2): c = [] # 创建列表存储所有共享字符 for i in s1: if i != " ": if i in s2: c.append(i) for i in s2: if i != " ": if i in s1: c.append(i) # 完成共享字符收集 d = set(c) # 去重得到迭代集合 e = {} # 用于存储次数-字符映射的字典 for i in d: a = s1.count(i) b = s2.count(i) m = max(a, b) e[m] = i # z = {i:max(s1.count(i), s2.count(i)) for i in d} 这个推导式能正常运行 return e # 返回z就能正常工作
现在遇到的问题:这个for循环看似只执行了3次,无法完成所有字符的遍历填充。
问题原因
不是循环没执行完,是字典的键具有唯一性,当多个字符的最大出现次数相同时,后面的字符会覆盖之前的键值对。
拿你的字符举例:
- 'r'的最大次数是2,'h'的最大次数也是2,'y'的最大次数还是2
- 遍历到'r'时,
e[2] = 'r';遍历到'h'时,e[2] = 'h'覆盖了'r';遍历到'y'时,e[2] = 'y'又覆盖了'h' - 最终字典里只会保留每个次数对应的最后一个字符,所以看起来像循环只执行了3次(因为不同的max值只有1、2、4三个)
而你注释里的字典推导式,是以字符为键、次数为值,和你想要的逻辑完全相反——因为每个字符是唯一键,不会被覆盖,所以能生成所有字符的条目。
解决方案
如果坚持要以最大次数为键,值应该改为对应该次数的字符列表/集合,避免覆盖。修改后的代码如下:
def mix(s1, s2): # 直接获取两个字符串中非空格的共享字符集合 shared_chars = set([c for c in s1 if c != " "]) & set([c for c in s2 if c != " "]) e = {} for char in shared_chars: count1 = s1.count(char) count2 = s2.count(char) max_count = max(count1, count2) # 键不存在则创建列表,存在则追加字符 if max_count not in e: e[max_count] = [] e[max_count].append(char) return e
测试输入你的s1和s2,会得到结果:
{2: ['y', 'h', 'r'], 4: ['e'], 1: ['t']}
这样就完整保留了所有对应同一最大次数的字符,不会出现覆盖问题。
内容的提问来源于stack exchange,提问作者post_lupy
相关产品推荐
相关产品推荐

