列表推导式多索引问题:如何实现返回偶数索引字符列表的函数?
解决思路:用
enumerate()获取准确索引 嗨,我完全懂你碰到的麻烦——str.index()方法确实只会返回第一个匹配字符的索引,所以当字符串里有重复内容时,这种方式根本没法拿到每个元素真正的位置,自然会出错。比如如果你的输入是"aabbcc",第二个'a'调用st.index('a')还是会得到0,导致它被错误地排除在结果外。
最佳解决方案:用enumerate()内置函数
Python里专门有个工具能完美解决这个问题——enumerate()。它会遍历可迭代对象(比如你的字符串),同时返回每个元素的真实索引和对应的元素值。修改后的代码如下:
def even_chars(st): if len(st) < 2 or len(st) > 100: return 'invalid string' else: # 这里保留了你原代码的判断逻辑(取奇数索引的元素) # 如果需要偶数索引(0、2、4...),改成 idx % 2 == 0 即可 return [char for idx, char in enumerate(st) if idx % 2 != 0]
另一种思路:直接遍历索引本身
如果你不想用enumerate(),也可以直接通过range()遍历字符串的索引范围,然后根据索引取值:
def even_chars(st): if len(st) < 2 or len(st) > 100: return 'invalid string' else: return [st[idx] for idx in range(len(st)) if idx % 2 != 0]
这种方法也能避开index()的问题,因为我们直接操作的是每个位置的真实索引,而不是通过字符去反向查找索引。
为什么你的原方法不行?
再明确一下:st.index(s)只会返回字符串中第一个出现s的位置,比如对于字符串"testtt",所有的t调用index()都会返回1,这就导致后面的t都会被错误地用同一个索引判断,完全不符合你的需求。而enumerate()和直接遍历索引的方式,都是从左到右逐个处理每个位置,所以每个元素的索引都是准确的。
内容的提问来源于stack exchange,提问作者Jan Kowalski
相关产品推荐
相关产品推荐

