<p>不要用坐标创建两个列表,至少一开始不要。这只会增加检测重复的难度。你知道吗</p>
<p>您可以使用坐标创建<em>元组</em>,这样就可以检测重复项,甚至可以生成一系列按顺序表示坐标的整数,然后从这些整数中进行采样。后者效率极高。你知道吗</p>
<p>要创建元组,基本上需要创建8个唯一的此类元组:</p>
<pre><code>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)
</code></pre>
<p>这并不是很有效,因为<code>coord not in coords</code>测试必须扫描随着每个新坐标而增长的整个列表。对于要拾取的大量坐标,这可能会显著减慢速度。您必须添加一个额外的<code>seen = set()</code>对象,您还需要向该对象添加坐标,然后在循环中再次测试以解决这个问题。不过,还有更好的办法。你知道吗</p>
<p>你的棋盘大小是9x9,所以你有81个独特的坐标。如果在Python 2中的<a href="https://docs.python.org/3/library/stdtypes.html#ranges" rel="nofollow">^{<cd4>} object</a>(<code>xrange()</code>)上使用<a href="https://docs.python.org/3/library/random.html#random.sample" rel="nofollow">^{<cd3>}</a>,则可以轻松地创建8个唯一值,然后从这些值中“提取”行和列号:</p>
<pre><code>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]
</code></pre>
<p>这里<code>random.sample()</code>保证得到8个唯一的坐标。你知道吗</p>
<p>这也比预先生成所有可能的元组要高效得多;在python3中使用<code>range()</code>使上面的方法使用O(K)内存,其中K是需要生成的值的数量,而预先创建所有坐标则需要O(N^2)内存(其中N是电路板侧的大小)。你知道吗</p>
<p>您可能仍希望存储<code>(x, y)</code>坐标的列表,而不是使用两个单独的列表。用<code>coords = [(c // 9, c % 9) for c in coords]</code>创建一个。你知道吗</p>