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

2024-09-25 08:42:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个程序,随机生成一个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)

Tags: the代码in列表forrangenumlist
3条回答

你的电路板足够小,你可以简单地产生所有的可能性,采取一个样本,然后转置到所需的X和Y的单独列表

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

不要用坐标创建两个列表,至少一开始不要。这只会增加检测重复的难度。你知道吗

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

要创建元组,基本上需要创建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个独特的坐标。如果在Python 2中的^{} objectxrange())上使用^{},则可以轻松地创建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个唯一的坐标。你知道吗

这也比预先生成所有可能的元组要高效得多;在python3中使用range()使上面的方法使用O(K)内存,其中K是需要生成的值的数量,而预先创建所有坐标则需要O(N^2)内存(其中N是电路板侧的大小)。你知道吗

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

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

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

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

相关问题 更多 >