Python每日一题(1)

一、题目

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()的专题讲解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值