Python中基于多个部分字符串匹配查找列表元素索引的方法
问题原因
你写的条件('aa' and '3') in s逻辑完全不对。Python中and是逻辑运算符,对非空字符串这类真值,会返回最后一个参与运算的真值,所以'aa' and '3'的计算结果就是字符串'3',你写的判断本质等价于'3' in s——只要元素里带字符3就会被匹配,自然会把所有含3的元素都筛出来,和“同时包含aa和3”的需求完全不符。
正确实现
in关键字一次只能判断单个子串是否存在,要同时匹配多个子串,需要单独写每个子串的存在判断,再用and连接两个逻辑条件即可,代码如下:
mylist = ["aa123", "bb2322", "aa354", "cc332", "ab334", "333aa"] # 同时判断元素包含'aa'且包含'3' res = [idx for idx, item in enumerate(mylist) if 'aa' in item and '3' in item] print(res)
运行后输出结果为[0, 2, 5],对应元素分别是索引0的"aa123"、索引2的"aa354"、索引5的"333aa",都是同时包含两个子串的元素。
注:你提到的预期结果里索引4对应的"ab334"仅包含字符3,不存在子串aa,不符合匹配规则,不会被返回。
如果后续需要扩展匹配更多子串,也可以用all()方法简化写法,要同时匹配N个子串时不用写多个and:
target_substrs = ('aa', '3') res = [idx for idx, item in enumerate(mylist) if all(sub in item for sub in target_substrs)]
两种写法的运行结果完全一致。
内容的提问来源于stack exchange,提问作者starlord
相关产品推荐
相关产品推荐

