Python中两种for循环写法差异:为何第一种longest_consec函数失效?
问题解析:为何版本1的longest_consec函数无法正常工作?
需求背景
给定字符串列表strarr和整数k,需返回由k个连续字符串拼接成的首个最长字符串。例如strarr = ["tree", "foling", "trashy", "blue", "abcdef", "uvwxyz"],k=2时应返回"folingtrashy"。
两个实现版本
版本1(无法正常工作)
def longest_consec(strarr, k): for i in range(0,len(strarr)): if len(strarr) > 0 and k >= 0 and k <= len(strarr): join = list(map(''.join, [strarr[i:k+i]])) longest = max(join, key=len) return longest else: return('')
版本2(正常工作)
def longest_consec(strarr, k): if len(strarr) > 0 and k >= 0 and k <= len(strarr): join = list(map(''.join, [strarr[i:i+k] for i in range(0, len(strarr))])) longest = max(join, key=len) return longest else: return('')
版本1失效的核心原因
版本1的问题出在两个关键地方:
- 循环刚启动就直接返回:进入
for循环后,第一次迭代(i=0)就触发了return语句,程序直接退出循环,根本不会去计算后续i对应的连续字符串拼接结果。这相当于只拿了第一个可能的组合就返回,完全没对比其他更长的选项。 - 拼接后的列表无对比价值:
[strarr[i:k+i]]是把单个连续子列表套进了一个新列表里,传给map后得到的join列表里只有一个拼接好的字符串。此时max(join, key=len)就是返回这个唯一的字符串,完全没有“找最长”的对比过程。
反观版本2,用列表推导式一次性生成了所有符合要求的连续子列表,再通过map把每个子列表拼接成完整字符串,最后用max从所有候选结果里挑出最长的(如果有多个长度相同的,max会保留第一个出现的,正好符合“首个最长”的要求)。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

