如何在Python列表推导式中使用else实现找不到目标时返回[-1]
问题解答
首先说明你现有写法的问题根源:
- 列表推导式中的
if存在两种完全不同的用法:- 放在
for关键字之前:属于三元表达式的一部分,作用是对每一轮迭代的元素做值转换,每轮迭代一定会生成一个对应的元素,所以你最初的写法才会返回和原列表长度完全一致的全-1列表 - 放在
for关键字之后:属于过滤条件,只有满足条件的迭代结果才会进入最终返回的列表,这里语法上不支持加else,所以你把else放在推导式末尾会直接报错
- 放在
你的需求本质是对列表推导式的最终整体结果做判断,不是对每个迭代元素单独处理,所以无法直接把else嵌到推导式内部实现效果,可以通过对推导式的返回结果加一层判断实现需求:
推荐写法(兼容性好、可读性高)
char_list = ['H', 'e', 'l', 'l', 'o', ',', ' ', 'W', 'o', 'r', 'l', 'd', '!'] def get_index(c, char_list): # 用enumerate替代手动遍历range(len()),写法更简洁 match_indexes = [idx for idx, char in enumerate(char_list) if char == c] # 空列表在Python中会判定为布尔假,为空时返回[-1],否则返回匹配到的索引列表 return match_indexes if match_indexes else [-1] # 测试存在的字符 print(get_index('r', char_list)) # 输出 [9] # 测试不存在的字符 print(get_index(';', char_list)) # 输出 [-1] # 测试多匹配场景 print(get_index('l', char_list)) # 输出 [2, 3, 10]
简写版本(一行实现)
利用Python中空序列为假值的特性,用or关键字简化判断逻辑:
def get_index(c, char_list): return [idx for idx, char in enumerate(char_list) if char == c] or [-1]
补充说明
如果要求必须把所有逻辑都塞到列表推导式内部是无法实现的,推导式的语法规则决定了它只能做元素转换或过滤操作,没有「整个结果为空时返回指定值」的能力,额外加一层外层判断是目前最合理的实现方案。
内容的提问来源于stack exchange,提问作者dftag
相关产品推荐
相关产品推荐

