Python如何按指定条件筛选嵌套列表的目标子列表并遍历
解决方案
首先明确前提:只有当你的列表按子列表的第二个元素有序排列/相同值连续集中时(你给出的示例正好符合这个特征,相同单位的子列表全部连续排列),才能做到无需遍历整个列表,仅遍历目标值对应的区间即可。如果列表是完全乱序的,没有规律,那么必须遍历全列表才能找出所有符合条件的项,没有跳过的可能。
方法1:针对连续排列场景的区间查找
思路是先定位第一个匹配目标值的索引,再定位第一个后续不匹配的索引,仅遍历这两个索引之间的元素即可:
lst = [[2,'UNIT'], [5,'TEN'], [8,'HUNDRED'], [7, 'THOUSAND'], [8, 'THOUSAND'], [9,'LAKH'], [6, 'LAKH'], [4, 'CRORE'], [2, 'CRORE'], [3, 'CRORE']] target = "CRORE" try: # 找到第一个匹配目标的起始索引 start_idx = next(i for i, item in enumerate(lst) if item[1] == target) except StopIteration: # 没有任何匹配项直接结束 matched_range = [] else: # 找到起始索引之后第一个不匹配的结束索引 end_idx = next((i for i in range(start_idx, len(lst)) if lst[i][1] != target), len(lst)) matched_range = lst[start_idx:end_idx] # 仅遍历匹配区间的元素 for item in matched_range: # 这里写你自己的业务逻辑 print(item)
运行输出:
[4, 'CRORE'] [2, 'CRORE'] [3, 'CRORE']
方法2:针对有序列表的二分查找(完全不遍历全列表,效率最高)
如果你的列表固定按UNIT < TEN < HUNDRED < THOUSAND < LAKH < CRORE的单位顺序排列,可以用二分查找定位区间,仅需要对数次判断即可完成定位,列表长度越大效率优势越明显:
lst = [[2,'UNIT'], [5,'TEN'], [8,'HUNDRED'], [7, 'THOUSAND'], [8, 'THOUSAND'], [9,'LAKH'], [6, 'LAKH'], [4, 'CRORE'], [2, 'CRORE'], [3, 'CRORE']] # 定义单位的优先级顺序 unit_rank = { "UNIT": 0, "TEN": 1, "HUNDRED": 2, "THOUSAND": 3, "LAKH": 4, "CRORE": 5 } target = "CRORE" target_rank = unit_rank[target] # 自定义二分查找左边界 def bisect_left(arr, target_rank): low, high = 0, len(arr) while low < high: mid = (low + high) // 2 if unit_rank[arr[mid][1]] >= target_rank: high = mid else: low = mid + 1 return low # 自定义二分查找右边界 def bisect_right(arr, target_rank): low, high = 0, len(arr) while low < high: mid = (low + high) // 2 if unit_rank[arr[mid][1]] > target_rank: high = mid else: low = mid + 1 return low left = bisect_left(lst, target_rank) right = bisect_right(lst, target_rank) # 仅遍历匹配区间 for item in lst[left:right]: print(item)
乱序列表的简化写法
如果你的列表是乱序的,必须遍历全列表,也可以用生成器表达式简化代码,内存开销更小:
target = "CRORE" for item in (x for x in lst if x[1] == target): print(item)
内容的提问来源于stack exchange,提问作者user15862630
相关产品推荐
相关产品推荐

