在Python中查找与数字相加的唯一数字的方法的数量

时间:2017-10-15 03:48:02

标签: python python-3.5

这是问题的描述:

  

有一个整数列表sequence。还有另一个整数参数target。目标是返回唯一方式的数量target可以表示为sequence中四个不同数字的总和。

这是我的代码:

def __main__(sequence, target):
    big = 0
    for elem in sequence:
        for elem_ in sequence:
            for _elem_ in sequence:
                for _elem__ in sequence:
                    if (elem + elem_ + _elem_ + _elem__ == target):
                        big+=1
    print(str(big))        
__main__([2, 1, 1, 1, 2, 1, 2, 2, 1], 6)

算法对我来说似乎很好。但是,根据测试用例,答案应该是2400,我会继续得到答案60。我怀疑我已经四次使用一种方法,但是再次将2400除以4并不会给你60

2 个答案:

答案 0 :(得分:2)

您可以使用itertools.combinations()

import itertools

def sums(lst, n):
  count = 0

  for sample in list(itertools.combinations(lst, 4)):
    if sum(sample) == n:
      count += 1

  return count

print(sums([2, 1, 1, 1, 2, 1, 2, 2, 1], 6)) # => 60

来自文档:

  

从输入迭代中返回元素的r长度子序列。

     

组合以字典排序顺序发出。因此,如果输入iterable已排序,则组合元组将按排序顺序生成。

     

元素根据其位置而不是其价值被视为唯一。因此,如果输入元素是唯一的,则每个组合中都不会有重复值。

combinations(range(4), 3) # --> 012 013 023 123

答案 1 :(得分:1)

以下是一种方法:

def sums(sequence, target):
    n = len(sequence)
    total = 0

    for i1 in range(n):
        v1 = sequence[i1]
        for i2 in range(i1+1, n):
            v2 = sequence[i2]
            for i3 in range(i2+1, n):
                v3 = sequence[i3]
                for i4 in range(i3+1, n):
                    v4 = sequence[i4]
                    if v1+v2+v3+v4 == target:
                        total += 1

    return total

def main():
    print(sums([2, 1, 1, 1, 2, 1, 2, 2, 1], 6))

main()

这确保每个列表元素最多使用一次,并提供所需的结果60。

循环比我简单一点简洁,但效率很高,并且不需要任何临时列表切片。