Python每日一题 2025.3.21
一、题目
question=[
"已知列表data中有若干字符串要求编写程序",
"对data中的字符串进行过滤,",
"只输出重复字符不超过一半的字符串",
]
二、分析
前两行看的很明白,可是最后一行有些看不懂。比如aabbccd,其中含有重复字符的有a、b和c,重复字符也就是aa、bb、cc,那么重复字符的数量是2(重复的数量)还是3(重复的类型)呢?还有就是,如果对于单字符而言,算不算重复呢?
我只有题目,没有答案,所以会优化一下题目,能让自己看懂些吧。“重复字符就按照最多出现次数”,比如aabbccd,aa、bb、cc都出现了两次,那么重复字符就是2,如果单字符的话,重复字符就是1。
回到问题上来,首先需要对data进行遍历,然后获取字符串的最大重复字符长度,然后将字符串长度的一半根最大重复字符长度比较判断,决定去留,最后输出。
三、自己源代码
import pdb
question=[
"已知列表data中有若干字符串要求编写程序",
"对data中的字符串进行过滤,",
"只输出重复字符不超过一半的字符串",
]
data=[
"a",
"aabb",
"ab",
"abcabc",
"aaaabbbb",
]
result=[]
def get_maxlen(s:str):
terms={}
# pdb.set_trace()
for i in s:
terms[i]=terms.get(i,0)+1#这里我们在字典那里讲过了,可以回顾一下
a=[terms[i]for i in terms.keys()]
maxlen=max(a)
return maxlen
for i in range(len(data)):
maxlen=get_maxlen(data[i])
str_len=len(data[i])
if(maxlen<=str_len/2): #我觉得循环条件应该没问题,不超过不就是小于等于吗
result.append(data[i])
print(result)
输出结果:
简单分析: 在函数get_maxlen()中,我用字典的.get()来统计每个char出现的次数,后续发现我需要的是字典terms中,值的最大值,我想的是将字典的值放到列表了,然后对列表max,获得最大值。不知道有没有更简单的方法(有,max(terms.values())直接获取值的最大值)。总觉得最后的if判断条件有些问题。。。
四、deepseek答案
from collections import Counter
data = [
"a",
"aabb",
"ab",
"abcabc",
"aaaabbbb",
]
def filter_strings(data):
result = []
for s in data:
if not s: # 可选:是否保留空字符串
continue
max_count = max(Counter(s).values(), default=0)
if max_count > len(s) / 2:
continue
result.append(s)
return result
print(filter_strings(data))
输出结果:
简单分析: Counter()会传入一个可迭代对象,返回的是一个类似字典的形式,其中键是可迭代对象的元素,值是该元素出现的次数。而.values()是其方法,返回的是出现次数。最后输出结果跟我的一样,但我感觉if的判断条件还是怪怪的。。。
五、源代码与ai代码分析
我自己觉得是一样的,再去问问deepseek和gpt是否也这么认为。
deepseek
chatgpt
六、总结
结合来看,难度不是很大,从根本上来看,python的包很多,自己也不可能完全掌握,首先需要用基本方法能做出来,然后再去了解其他的包。从这道题目我知道了Counter(),其方法也很多,需要一步一步了解。后续也会出个Counter()的专题讲解。