两个单独的列表和相应的数字。如何检测它们从列表中删除?

时间:2016-10-09 10:12:52

标签: python arrays list python-3.x

我正在寻找一个在8x8网格上随机生成硬币的程序。我创建了两个列表(一个列表用于X坐标,列表用于Y坐标)。在这些列表中,两个坐标不能相同。这很难解释,所以这就是我的意思:

[1, 7, 4, **6**, 9, 2, 3, **6**, 8, 0] (list for the x co-ordinate)
[9, 3, 3, **1**, 2, 8, 0, **1**, 6, 1] (list for the y co-ordinate)

因此,创建了两个列表。但(6,1)出现两次。我不想要这个。那么,我如何在我的代码中允许这样做,以确保忽略它并将数字重新生成不同的坐标?我的代码如下,我真的不知道如何实现这样的系统事情!

def treasurePro():
    global coinListX, coinListY
    coinListX = []
    coinListY = [] 
    for x in range(10): 
        num = randint(0,8) 
        coinListX.append(num) 
        print(coinListX)
    for x in range(10): 
        num = randint(0,8)
        if num == 0 and coinListX[x] == 0:
            treasurePro() #goes back to the beginning to restart.  
        else:
            coinListY.append(num) 
            print(coinListY)

4 个答案:

答案 0 :(得分:1)

你的电路板足够小,你可以简单地生成所有可能性,取样,然后转换到所需的X和Y单独列表。

possibilities = [(a,b) for a in range(10) for b in range(10)]
places = random.sample(possibilities, 10)
x,y = zip(*places)

答案 1 :(得分:1)

不要创建两个带坐标的列表,至少不是最初的。这只会使检测重复更难。

您可以使用坐标创建元组,这样您就可以检测重复项,甚至可以生成一系列整数,这些整数按顺序表示您的坐标,然后从这些整数中进行采样。后者非常有效。

要创建元组,基本上你想要创建8个唯一的这样的元组:

def treasurePro():
    coords = []
    while len(coords) < 8:
        coord = randint(0, 8), randint(0, 8)
        if coord not in coords:
            coords.append(coord)
    # now you have 8 unique pairs. split them out
    coinListX, coinListY = zip(*coords)

这不是那么有效,因为coord not in coords测试必须扫描每个新坐标增长的整个列表。对于要选择的大量坐标,这可能会显着减慢。你必须添加一个额外的seen = set()对象,你也可以在循环中添加坐标并再次测试以解决这个问题。但是有更好的方法。

您的纸板尺寸为9x9,因此您有81个独特的坐标。如果您在random.sample()(Python 2中为xrange())上使用range() object,则可以轻松创建8个唯一值,然后从中提取行和列号:

def treasurePro():
    coords = random.sample(range(9 * 9), 8)  # use xrange in Python 2
    coinListX = [c // 9 for c in coords]
    coinListY = [c % 9 for c in coords]

此处random.sample()可确保您获得8个唯一坐标。

这比预先生成所有可能的元组要有效得多;在Python 3中使用range()使得上面使用O(K)内存,其中K是您需要生成的值的数量,而预先创建所有坐标将需要O(N ^ 2)内存(其中N是板面的大小)。

您可能仍希望存储(x, y)坐标列表,而不是使用两个单独的列表。使用coords = [(c // 9, c % 9) for c in coords]创建一个。

答案 2 :(得分:0)

您想要生成随机坐标,但您也想要拒绝任何坐标 已经出现在列表中的一对坐标。 (偶然, 而不是两个单独的整数列表,我建议使用一个 有序对的列表,即两个整数的元组。)

拒绝重复的一种方法是搜索现有列表 新的一套。这是O(n)并且比它需要的慢,尽管它 肯定会在你的用例中工作,其中n不能超过64。

另一种方法是尽可能维护第二个数据结构 在O(1)时间内查找64个单元中的每一个,例如8x8数组 布尔值。实际上,你可以单独使用这个结构;得到一个 使用的坐标列表,只是遍历它。

答案 3 :(得分:0)

cordX = [x for x in range(10)]
cordY = cordX[:] 
random.shuffle(cordX)
random.shuffle(cordY)