You need to enable JavaScript to run this app. Python如何按指定条件筛选嵌套列表的目标子列表并遍历
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 12:06:04