Python For循环重复并生成比指定值更多的值

Python For循环重复并生成比指定值更多的值,python,Python,我试图在画布上粘贴3个矩形图像。目标是使图像位于画布内,并且不会重叠。为此,我决定生成3个两元组值,作为图像左上角xy坐标的位置。大概是这样的: locations_used = [(950, 916), (1097, 119), (1290, 526)] 它所做的是重复第一个值3x,然后添加2个新值,当我指定3时,总共给出5个位置。像这样: [(950, 916), (950, 916), (950, 916), (1097, 119), (1290, 526)] 这是我的代码的MRE:

我试图在画布上粘贴3个矩形图像。目标是使图像位于画布内,并且不会重叠。为此,我决定生成3个两元组值,作为图像左上角xy坐标的位置。大概是这样的:

locations_used = [(950, 916), (1097, 119), (1290, 526)]
它所做的是重复第一个值3x,然后添加2个新值,当我指定3时,总共给出5个位置。像这样:

[(950, 916), (950, 916), (950, 916), (1097, 119), (1290, 526)]
这是我的代码的MRE:


    n = 3
    canvas_width = 500
    canvas_height = 300
    logo_width = 50
    logo_height = 30
    locations_used = []
    
    for i in range(0, n):
        
        logo_location_x, logo_location_y = logo_position(canvas_width, canvas_height, logo_width, logo_height)
        locations_used.append((logo_location_x, logo_location_y))

        for img in locations_used:
            if logo_location_x in range(img[0], logo_width) or logo_location_y in range(img[1], logo_height):
                pass
        else:
            while len(locations_used) < n:
                locations_used.append((logo_location_x, logo_location_y))

     print(len(locations_used))
     print(locations_used)
     print('\n')

在第一次迭代中,将
logo\u location\u x
(950)和
logo\u location\u y
(916)与
范围(950,50)
范围(916,30)
进行比较。由于
start
参数小于
stop
,所以范围为空,程序执行
else
子句。当所使用的
位置的长度小于3时,将添加相同的值,从而使数组
[(950,916),(950,916),(950,916)]

在接下来的两次迭代中,每个新的
x,y
对都被添加到
位置使用的
。而
范围(img[0],logo\u宽度)
范围(img[1],logo\u高度)
仍然是空的,而
位置使用的长度大于
n
,因此不会添加额外的元素

这是编辑代码以创建不重叠的位置

#不要只迭代3次,而是尝试直到列表已满。
而len(使用的位置)
您的else语句没有正确缩进。请尝试此操作

if logo_location_x in range(img[0], logo_width) or logo_location_y in range(img[1], logo_height):
    pass
else:
    while len(locations_used) < n:
            locations_used.append((logo_location_x, logo_location_y))
如果徽标位置在范围内(img[0],徽标宽度)或徽标位置在范围内(img[1],徽标高度):
通过
其他:
而len(使用的位置)
你有一个while循环,它会将一个位置添加到列表中,直到列表的长度为3,因此我认为这是罪魁祸首。我也会将我的钱放在那里,但我不知道如何修复它。我不确定你为什么会有这个while循环。因为你的第一个循环从1到n运行,这是确保你只将n个位置添加到列表中的好方法e list只在for循环的每次迭代中运行一个append调用,而不在其他任何地方运行。您是否尝试随机采样位置,直到找到一个不会导致重叠的位置?@Alex我正在尝试确保列表在低于n时膨胀。当我删除while循环时,列表将获得6个元组条目。您如何ink我应该着手解决这个问题?@oo92你到底想实现什么?我看到你制作了三个矩形的位置,但我不知道你想用它们做什么。这些矩形的位置需要保持在画布内,并且不能重叠。我将在另一个函数中应用这些位置,并且已经编写了一个。For这一点,我只想附加3个符合上述条件的唯一位置。@oo92我编辑了你的函数,请检查它。
#在检查位置是否重叠之前,不要添加位置。
你需要先添加1个位置,这样列表就不会为空。第2个条目将避免与第1个重叠,第3个条目将避免重叠两者都有。。
if logo_location_x in range(img[0], logo_width) or logo_location_y in range(img[1], logo_height):
    pass
else:
    while len(locations_used) < n:
            locations_used.append((logo_location_x, logo_location_y))