繁体   English   中英

如何打印原始输入列表的索引

[英]How to print indices of the original input list

我正在尝试获得等于目标总和的所有可能组合。 我拥有的脚本可以很好地做到这一点,但是我需要输出以显示原始索引号。 我编写的脚本输出正确的数字组合,但没有正确的索引。

正确输出示例:

input=([1, 2, 3, 4], target_sum=6) output=[1,3], [0,1,2]

我拥有的代码如下( source ):

numbers = [1,2,3,4,5]
target = 6    

def calc_combo(input_number, target_sum, partial=[]):
    total = sum(partial)
    idx = []
    index = [[num,indices] for indices,num in enumerate(partial)]

    if total == target_sum:    
        for i in index:
            idx.append(i)
        print(str(idx) + " = " + str(target_sum))     

    if total >= target_sum:
        return

    for i in range(len(input_number)):
        n = input_number[i]
        remaining = input_number[i+1:]
        calc_combo(remaining, target_sum, partial + [n])

calc_combo(numbers, target)

给出以下输出:

[[1, 0], [2, 1], [3, 2]] = 6
[[1, 0], [5, 1]] = 6
[[2, 0], [4, 1]] = 6

任何帮助是极大的赞赏!

您可以使用list.index(elem)来获取列表中元素的索引

在您的代码中,您可以替换该行

index = [[num,indices] for indices,num in enumerate(partial)]其中

index = [[num,input_number.index(num)] for num in partial]

否则,您可以使用以下代码,该代码考虑所有组合并且不使用函数index ,而是返回(数字,索引)的列表,而不是打印(数字,索引)的列表的列表:

def combo(options, target):
    ret = []
    for level in range(len(options)):
        for i,c in enumerate(options):
            for j,g in enumerate(options[i+1:]):
                if i+1+j+level <= len(options):
                    combo = [c,*options[i+1+j:i+1+j+level]]
                    if sum(combo) == target:
                        index = [i,*list(range(i+1+j,i+1+j+level))]
                        ret.append((combo, index))
                if level == 0:
                    break
    return ret

Python 3的预期输出:

>>>combo(list(x*2**-2 for x in range(-4,5,1)), 2)
[([0.25, 0.75, 1.0], [5, 7, 8]),
 ([-0.25, 0.5, 0.75, 1.0], [3, 6, 7, 8]),
 ([-0.5, 0.25, 0.5, 0.75, 1.0], [2, 5, 6, 7, 8]),
 ([-0.5, 0.0, 0.25, 0.5, 0.75, 1.0], [2, 4, 5, 6, 7, 8])]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM