You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取列表中元素和为指定值的元素索引

找列表中元素和为指定值的索引组合

嘿,这个需求我之前做项目时刚好遇到过!你提到用itertools.combinations的思路完全可行,咱们可以把它变成具体的代码,甚至还能优化效率,下面分两种情况给你讲讲:

1. 基于itertools.combinations的直接实现

如果你的列表规模不大,用组合生成的方法简单直观,完全能满足需求。核心逻辑就是生成所有可能的索引对,然后筛选出元素和等于目标值的组合,找到第一个就停止(符合你示例里要的[0,4]):

import itertools

a = [50, 50, 50, 50, 75, 75]
target = 125

# 生成所有两两不重复的索引组合
for indices in itertools.combinations(range(len(a)), 2):
    if a[indices[0]] + a[indices[1]] == target:
        print(list(indices))  # 输出: [0, 4]
        break  # 找到第一个匹配项就终止循环

要是你需要所有符合条件的组合,只需要去掉break,把结果收集到列表里就行:

import itertools

a = [50, 50, 50, 50, 75, 75]
target = 125
all_matching_pairs = []

for indices in itertools.combinations(range(len(a)), 2):
    if a[indices[0]] + a[indices[1]] == target:
        all_matching_pairs.append(list(indices))

print(all_matching_pairs)
# 输出: [[0,4], [0,5], [1,4], [1,5], [2,4], [2,5], [3,4], [3,5]]

2. 更高效的哈希表方法(适合大列表)

如果你的列表特别长,itertools.combinations会生成O(n²)个组合,效率会很低。这时候可以用哈希表(字典)来优化,把时间复杂度降到O(n):

def find_first_matching_pair(arr, target_sum):
    # 用字典存储每个数值第一次出现的索引
    value_to_indices = {}
    for idx, num in enumerate(arr):
        complement = target_sum - num
        # 如果补数存在于字典中,说明找到了配对
        if complement in value_to_indices:
            return [value_to_indices[complement], idx]
        # 只存储数值第一次出现的索引(保证找到最早的组合)
        if num not in value_to_indices:
            value_to_indices[num] = idx
    # 没有找到匹配的情况
    return None

a = [50, 50, 50, 50, 75, 75]
target = 125
print(find_first_matching_pair(a, target))  # 输出: [0, 4]

这个方法的逻辑是:遍历列表时,记录每个数值第一次出现的索引;对于当前元素,计算需要的补数(目标和减去当前元素),如果补数已经在字典里,就直接返回之前的索引和当前索引,这样就能快速找到最早的匹配组合。

内容的提问来源于stack exchange,提问作者Fadri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:17:28