我制作了一个程序,该程序采用数字列表并输出"三元组。" 三元组由x / y / z表示,x> = y> = z
出于某种原因,在执行我的代码时,我得到了一个"内存错误。"我不确定为什么会这样或者如何解决它。我只能假设它与错误地管理内存或使我的程序更有效率有关。
这很冗长,但我不能留下任何东西,因为我不知道问题是什么。
所以有两个问题......我如何解决这个"内存错误。"我怎样才能使这个程序更有效率? (它的速度非常慢。)
节目输出: [[6,3,1],[6,2,2],[6,2,1],[6,1,1],[5,1,1],[4,2,2],[ 4,2,1],[4,1,1],[3,1,1],[2,2,1],[2,1,1]] 11
l = [1,1,2,2,3,4,5,6]
def answer(l):
l.sort()
l.reverse()
triples = []
final = []
for first_main_counter in range(len(l)):
main_testing_number = l[first_main_counter]
divisors = []
divisors = [x for x in l if main_testing_number % x == 0]
del divisors[0]
for second_main_counter in range(len(divisors)):
second_main_testing_number = divisors[second_main_counter]
divisors2 = []
divisors2 = [x for x in divisors if second_main_testing_number % x == 0]
del divisors2[0]
for x in range(len(divisors2)):
triples.append([l[first_main_counter],divisors[second_main_counter],divisors2[x]])
seen = set()
for item in triples:
t = tuple(item)
if t not in seen:
final.append(item)
seen.add(t)
print(final)
print(len(final))
answer(l)
答案 0 :(得分:3)
如果我理解正确,你可以做得那么多,更简单:
>>> {(x, y, z) for x, y, z in itertools.combinations(l, 3) if z % y == 0 and y % x == 0}
{(1, 1, 2),
(1, 1, 3),
(1, 1, 4),
(1, 1, 5),
(1, 1, 6),
(1, 2, 2),
(1, 2, 4),
(1, 2, 6),
(1, 3, 6),
(2, 2, 4),
(2, 2, 6)}
就是这样。只要您的列表已排序,itertools.combinations
将仅按升序返回三元组。 (如果你的列表没有排序,只需先排序。如果你想按顺序排序,反向排序并切换可分性检查的方向。)你不需要做所有费力的除数检查你'干嘛。只需检查每个组合,看看它是否满足“x divides y”和“y divides z”。
如果您更关心速度,这里的版本速度可与原版相媲美,但更具可读性:
def anotherWay(stuff):
result = set()
for ix, x in enumerate(stuff):
for iy, y in enumerate(stuff[ix+1:], ix+1):
if y % x:
continue
for z in stuff[iy+1:]:
if z % y:
continue
result.add((x, y, z))
return result
(这再次假定列表以升序顺序,并返回z >= y >= x
的结果,这是您在问题中要求的结果,而不是您的代码实际执行的内容。)