python在列表中找出三个数相加等于目标值返回这两个数在列表中的下标(ThreeSum)

代码实现: 

def threeSum(alist, targetnum):
    for i, j in enumerate(alist):
        for m, n in enumerate(alist[i+1:]):
            realM = i+m+1
            k = i+m+2
            if alist[k:].count(targetnum - (j+n)) > 0:
                for x in range(alist[k:].count(targetnum - (j+n))):
                    y = alist.index(targetnum - (j+n), k)
                    print(i, realM, y)
                    k = y+1


a = [1, 3, 4, 6, -3, 4, 1, 3, 8, 9, 3, 0, -3]
threeSum(a, 7)

输出结果:

0 1 7
0 1 10
0 3 11
0 4 9
0 7 10
0 9 12
1 2 11
1 5 11
1 6 7
1 6 10
2 3 4
2 3 12
2 7 11
2 10 11
3 4 5
3 5 12
3 6 11
4 6 9
5 7 11
5 10 11
6 7 10
6 9 12

逐行说明:

#定义函数threeSum接收参数为列表及目标值
def threeSum(alist, targetnum):
#假设这三个数分别为a,b,c和为targetnum,此处设置第一重循环,获取循环获取a的下标和值
    for i, j in enumerate(alist):
#此处设置第二重循环用于获取b的下标和值
        for m, n in enumerate(alist[i+1:]):
#由于b的下标和值使用了切片操作每次取i+1后值,每次获取的下标m不是在原列表中的实际为,所以需要通过计算realM得到b在原列表的实际位置
            realM = i+m+1
#根据i和m的值计算c在原列表中取值的起始位置,由于c需要在b后面一位开始取值,所以需要+2
            k = i+m+2
#通过统计c出现次数,判断targetnum - (j+n)是否出现在列表索引k位置之后
            if alist[k:].count(targetnum - (j+n)) > 0:
#c值在列表索引k位置之后可能出现多次,此处用循环取得所有c值
                for x in range(alist[k:].count(targetnum - (j+n))):
#使用index函数获取c值对应的下标索引
                    y = alist.index(targetnum - (j+n), k)
#打印一组a,b,c值对应的索引下标
                    print(i, realM, y)
#重置c值的搜索起始位置为y+1
                    k = y+1

#定义输入列表数据
a = [1, 3, 4, 6, -3, 4, 1, 3, 8, 9, 3, 0, -3]
#调用函数传入列表a及目标值7
threeSum(a, 7)

 

你可能感兴趣的:(python)