这是问题的描述:
有一个整数列表
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
。
答案 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。
循环比我简单一点简洁,但效率很高,并且不需要任何临时列表切片。