这个循环方法正确吗?Python 3.4.3

这个循环方法正确吗?Python 3.4.3,python,loops,python-3.x,location,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("O

所以,我想要一组彼此不同的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)
重新制作的位置是否与列表中的其他位置相同?

重新制作的位置是否与列表中的其他位置相同

是的,因为您使用的是random。如果要确保保留唯一项,可以使用
set
对象来实现该目标,从而为您保留唯一项。但请注意,由于列表不是可散列的对象,您应该为成对对象(如元组)使用可散列的容器:


为了确保有6个不同的元素,您可以使用
random.shuffle

from random import shuffle

all=[(x,y) for x in range(5) for y in range(5)]
shuffle(all)
print(all[:6])

"""
[(0, 1), (3, 4), (1, 1), (1, 3), (4, 3), (0, 0)]
"""

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

检查随机生成的“位置”是否已在“位置列表”列表中。这仅仅是一句话:

position in positionList
返回True或False。如果“位置”已出现在列表中,则执行while循环。你只需计算另一个随机位置


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

如果您确实需要列表,您可以转换,如果不只是保持代码不变:

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)
,因为顺序似乎不相关,只使用集合可能就足够了。

这是一种方法

import random

    my_list =[]
    num_of_points = 6 

    while True:
        position = [random.randint(0,5),random.randint(0,5)]
        if position not in my_list:
            my_list.append(position)
            print num_of_points
            num_of_points -=1
            if (num_of_points == 0):
                break

    print my_list

当然,您只需要确保可能的随机对的数量超过num_op_points值。

顺便说一句,Python 3.0确实不受欢迎。Python3.x的开发已经在3.4版本了years@Slayer您好,没有。我只需要6个不同的XY位置making
positionList=set()
将删除线性查找,您是采样一次还是多次?您还需要使用元组添加到集合中,以便我需要将每个位置转换为元组吗?
pos=random.randint(0,5),random.randint(0,5)
,如果pos不在pos\u集合中<代码>位置集。添加(位置)代替您的附件(不是我的附件),但尝试
设置([(0,0)、(4,5)、(4,2)、(0,0)、(3,4)、(0,0)])
;)关键是要得到6个唯一的pairs@PadraicCunningham那有什么问题吗?结果将是
>>>集([(0,0),(4,5),(4,2),(0,0),(3,4),(0,)])集([(4,5),(4,2),(0,0),(3,4),(0,)])
,但请注意
(0,)
在这种情况下是无效的。lol它肯定不会是
集([(0,0),(4,5),(4,2),(0,0),(3,4),(0,))
),集合有重复吗?@Padraiccnningham集合理解不能保证集合的长度始终为6。查看更新:)。是的,这正是我想表达的观点;)+1为了看到灯光不用担心,你可以按照kasra的代码循环直到长度为6,我只是让代码尽可能类似于你自己的代码
import random

    my_list =[]
    num_of_points = 6 

    while True:
        position = [random.randint(0,5),random.randint(0,5)]
        if position not in my_list:
            my_list.append(position)
            print num_of_points
            num_of_points -=1
            if (num_of_points == 0):
                break

    print my_list