这种循环方法是否正确? Python 3.4.3

时间:2016-04-09 18:33:49

标签: python loops python-3.x location

所以,我想要一组彼此不同的XY位置。为了做到这一点,我使用了一个列表来存储随机生成的变量XY。如果该位置不在列表中,它将被添加到它中,如果它在列表中,那么它将为它重新创建一个位置。

我不确定这是否适用于所有情况,并想知道是否有更好的方法。

import random

positionList = []

for i in range(6):
    position = [random.randint(0,5),random.randint(0,5)]
    print("Original", position)
    while position in positionList:
        position = [random.randint(0,5),random.randint(0,5)]
    positionList.append(position)
    print(position)

重拍位置可能与列表中的其他位置相同吗?

3 个答案:

答案 0 :(得分:2)

重拍位置可能与列表中的其他位置相同吗?

是的,因为您使用的是随机的。如果您想确保保留唯一项目,可以使用set对象实现该目标,为您保留唯一项目。但请注意,由于列表不是可清除对象,因此您应该使用可容纳的容器(如元组):

>>> position_set = set()
>>> 
>>> while len(position_set) != 6: 
...     position = (random.randint(0,5), random.randint(0,5))
...     position_set.add(position)
... 
>>> position_set
set([(3, 2), (5, 0), (2, 5), (5, 2), (1, 0), (3, 5)])

答案 1 :(得分:1)

如果你真的需要列表,你可以转换,如果不是只保留代码:

import random

position_set = set()

for i in range(6):
    position = random.randint(0, 5), random.randint(0, 5)
    print("Original", position)
    while position in position_set:
        position = random.randint(0, 5), random.randint(0, 5)
    position_set.add(position)
    print(position)
print(position_set)

对于列表,设置查找为O(1) vs O(n),因为顺序似乎无关紧要,只需使用一个集合就足够了。

答案 2 :(得分:0)

我只是运行你的代码,它似乎工作得很好。我相信这是正确的。让我们考虑你的while循环。

您检查随机生成的“#”位置'已经在' positionList'名单。仅仅是声明:

position in positionList

返回True或False。如果'位置'已经出现在列表中,while循环被执行。而你只是计算另一个随机位置。

我唯一能给出的建议是添加一个循环计数器。当你用尽可能的XY位置时,循环会永远运行。