我正在用随机生成的炸弹进行扫雷游戏。但有时我发现炸弹坐标列表中有重复。如何检查列表中的重复项并将其替换为其他随机坐标。
from random import randint
def create_bombpos():
global BOMBS, NUM_BOMBS, GRID_TILES
for i in range(0, NUM_BOMBS):
x = randint(1, GRID_TILES)
y = randint(1, GRID_TILES)
BOMBS.append((x, y))
print(BOMBS)
用户可以通过输入GRID_TILES
来决定电路板的大小。
如果输入5,则电路板将为5x5。炸弹的数量是:
GRID_TILES * GRIDTILES / 5
答案 0 :(得分:4)
每次搜索整个BOMBS列表都会花费O(n)
(线性时间)。为什么不使用set代替? a Set保证你最终会得到不同的(就散列而言)元素。
from random import randint
def create_bombpos():
BOMBS = set()
i = 0
while i<NUM_BOMBS:
x = randint(1, GRID_TILES)
y = randint(1, GRID_TILES)
if (x,y) not in BOMBS
BOMBS.add((x, y))
i = i + 1
print(BOMBS)
让我举一个例子:
>>> a = set()
>>> a.add((1,2))
>>> a
{(1, 2)}
>>> a.add((1,2))
>>> a.add((1,3))
>>> a.add((1,2))
>>> a
{(1, 2), (1, 3)}
我可以多次将相同的元素添加到集合中,但只会出现1个实例。
答案 1 :(得分:3)
from random import randint
def create_bombpos():
global BOMBS, NUM_BOMBS, GRID_TILES
i = 0
while i<NUM_BOMBS:
x = randint(1, GRID_TILES)
y = randint(1, GRID_TILES)
if (x,y) not in BOMBS
BOMBS.append((x, y))
i = i + 1
print(BOMBS)
如果新生成的点已经在列表中,那么i
不会增加,我们将找到另一个新生成的点,直到它BOMBS
中不存在。< / p>
希望它有所帮助!!
答案 2 :(得分:3)
你也可以使用random.sample来实现这个目标:
from random import sample
GRID_TILES = 100
NUM_BOMBS = 5
indexes = sample(range(GRID_TILES * GRID_TILES), NUM_BOMBS)
BOMBS = [(i // GRID_TILES, i % GRID_TILES) for i in indexes]
答案 3 :(得分:0)
为此使用python集,它将自动检查重复项并简单地忽略列表中已有的每个条目。 我还认为运行时比使用列表并手动检查重复项要好得多。