使用生成器表達式的簡單解決方案From PEP 289 Generator Expressions
Rationale
Experience with list comprehensions has shown their widespread utility
throughout Python. However, many of the use cases do not need to have a full list created in memory. Instead, they only need to iterate over the elements one at a time.
因為你不需要保存中間結果
可能你有一個大的數據集
以及itertools標準庫模塊中的^{},因為您需要計算數據集中每對有趣的點的距離。在$ cat euclid.py
from scipy.spatial.distance import euclidean
from itertools import combinations
lines = ['HETATM 1 H10 XSHQ 0 10.139 2.231 0.091 1.00 0.00 H',
'HETATM 2 N1 XSHQ 0 9.641 1.386 -0.104 1.00 0.00 N',
'HETATM 3 H9 XSHQ 0 9.773 1.133 -1.063 1.00 0.00 H',
'HETATM 4 C1 XSHQ 0 8.245 1.531 0.230 1.00 0.00 H']
H_lines = (line for line in lines if line[-1]=='H')
H_lists = (line.split() for line in H_lines)
H_data = ((int(tok[1]), [float(x) for x in tok[5:8]]) for tok in H_lists)
H_dist = {(i[0], j[0]):euclidean(i[1], j[1])
for i, j in combinations(H_data, 2)}
for m, n in H_dist:
print('Distance between points %d and %d is %.6f'%(
m, n, H_dist[m, n]))
$ python3 euclid.py
Distance between points 1 and 3 is 1.634404
Distance between points 1 and 4 is 2.023995
Distance between points 3 and 4 is 2.040842
$