Python 值在嵌套for循环之后在列表中显示两次

Python 值在嵌套for循环之后在列表中显示两次,python,Python,在我的代码中,我有3个for循环。它们执行我需要它们执行的操作,但在我打印列表“z”后,想要的值将显示两次而不是一次 我的代码: x = [200, 100, 50, 20, 10, 5] z = [] for i in range(0,len(x)): for j in range(i+1,len(x)): for k in range(i+2,len(x)): sum=x[i]+x[j]+x[k] if sum%65=

在我的代码中,我有3个for循环。它们执行我需要它们执行的操作,但在我打印列表“z”后,想要的值将显示两次而不是一次

我的代码:

x = [200, 100, 50, 20, 10, 5]

z = []
for i in range(0,len(x)):
    for j in range(i+1,len(x)):
        for k in range(i+2,len(x)):
            sum=x[i]+x[j]+x[k]
            if sum%65==0:
                z.append(sum)

print(z)
#out = [260, 260, 130, 130, 65, 65]
更多背景: 我的目标是将列表“x”中3个数字的总和的所有值放入一个新的列表“z”,如果总和可被65整除(%65==0)

如何获得只显示一次的所需值?

您可以这样做:

print(set(z))
它将消除所有重复,但集合中的元素将以随机顺序排列。
您可以阅读有关集合的更多信息,而不是像其他注释和答案那样尝试修复输出,让我们尝试修复实际代码

执行此操作时:

for j in range(i+1,len(x)):
        for k in range(i+2,len(x)):
你重复计算一些组合,因为j和k都依赖于i。(具体来说,您可以达到像200,50,10和200,10,50这样的组合)

而是这样做:

for j in range(i+1,len(x)):
    for k in range(j+1,len(x)):
问题马上就解决了

这不是非常“pythonic”的做法,因此使用python中包含的itertools库可能会做得更好

from itertools import combinations

z = [sum(i) for i in combinations(x,r=3) if sum(i)%65 == 0]

似乎可以做到这一点。

问题在于迭代的范围

>>> for i in range(0,len(x)):
        for j in range(i+1,len(x)):
            for k in range(i+2,len(x)):
                s=x[i]+x[j]+x[k]
                if s%65==0:
                    print(f"{i=}, {j=}, {k=} = {s=}")

                
i=0, j=2, k=4 = s=260
i=0, j=4, k=2 = s=260
i=1, j=3, k=4 = s=130
i=1, j=4, k=3 = s=130
i=2, j=4, k=5 = s=65
i=2, j=5, k=4 = s=65
k范围回溯已经跟踪的数字,使其范围从j+1开始

>>> for i in range(0,len(x)):
        for j in range(i+1,len(x)):
            for k in range(j+1,len(x)):
                s=x[i]+x[j]+x[k]
                if s%65==0:
                    print(f"{i=}, {j=}, {k=} = {s=}")

                
i=0, j=2, k=4 = s=260
i=1, j=3, k=4 = s=130
i=2, j=4, k=5 = s=65
>>> 

例如,您可以检查该号码是否已在列表中,如果已在列表中,则不要再添加该号码。您可以使用
set()
而不是列表-无需进行任何检查。集合在性质上是唯一的。您的问题是:对于范围(i+2,len(x))中的k:应该是范围(j+1,len(x))中的k:请阅读。您也可以使用它来帮助逐步可视化代码的执行。是的,但结果是一个集合,如果您不想使用列表,请使用
list(set(z))
,如果您想保持相同的顺序,请使用
list(dict.fromkeys(z))
,请注意这解决了输出问题,不是用于提供输出的算法。添加了重复计数的示例
>>> for i in range(0,len(x)):
        for j in range(i+1,len(x)):
            for k in range(j+1,len(x)):
                s=x[i]+x[j]+x[k]
                if s%65==0:
                    print(f"{i=}, {j=}, {k=} = {s=}")

                
i=0, j=2, k=4 = s=260
i=1, j=3, k=4 = s=130
i=2, j=4, k=5 = s=65
>>>