Python 值在嵌套for循环之后在列表中显示两次
在我的代码中,我有3个for循环。它们执行我需要它们执行的操作,但在我打印列表“z”后,想要的值将显示两次而不是一次 我的代码: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=
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
>>>