擅长:python、mysql、java
<p>在列表中的每个位置唯一对上循环的惯用方法是从内部循环中的<code>i + 1</code>开始:</p>
<pre><code>In [4]: data = 'abc'
In [5]: [(data[i], data[j]) for i in range(len(data)) for j in range(i+1, len(data))]
Out[5]: [('a', 'b'), ('a', 'c'), ('b', 'c')]
In [6]: data = 'abcd'
In [7]: [(data[i], data[j]) for i in range(len(data)) for j in range(i+1, len(data))]
Out[7]: [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'c'), ('b', 'd'), ('c', 'd')]
</code></pre>
<p>在处理序列类型时,它是一个简单而有效的算法。你知道吗</p>
<p>还要注意,<code>math</code>有一个方便的<code>hypot</code>函数,它只是欧几里德范数。因此,您可以简单地将其实现为:</p>
<pre><code>In [8]: ps = list(zip(
...: [4, -2, -3, -1, 2, -4, 1, -1, 3, -4, -2],
...: [4, -2, -4, 3, 3, 0, 1, -1, -1, 2, 4]
...: ))
In [9]: import math
...: def dis(p1, p2):
...: (x0, y0), (x1, y1) = p1, p2
...: return math.hypot(x1 - x0, y1 - y0)
...:
In [10]: min(dis(ps[i], ps[j]) for i in range(len(ps)) for j in range(i + 1, len(ps)))
Out[10]: 1.4142135623730951
</code></pre>
<p>请注意,将lambda表达式的结果指定给名称是针对PEP8的。因此,应该使用<code>snake_case</code>而不是<code>CapitalCase</code>作为函数名。你知道吗</p>