由于这肯定是很常见的情况,所以我想知道以下情况是否有任何预先存在的解决方案。
可以说我有一组N个字符串,并且正在计算它们之间的距离。在这种情况下,这是一个汉明距离,但这并不是很重要。
如果我想尽可能快地做到这一点,我将避免像这样的自我比较:
def hamming_distance(string1, string2):
"""Return the Hamming distance between equal-length sequences"""
if len(string1) != len(string2):
raise ValueError("Undefined for sequences of unequal length")
return sum(ch1 != ch2 for ch1, ch2 in zip(s1, s2))
ratios=[]
for a, i in enumerate(string_list):
for b, j in enumerate(string_list):
if a == b: # Avoid self comparisons for speed
break
ratios.append(hamming_distance(string_list[i], string_list[j]))
return ratios
但是由于这是“对称的”,所以我也可以放弃任何相互的比较,如果字符串很多和/或很大,这将提高速度。
在上面的设置中,是否存在一种普遍接受的/优雅的方法?
我也知道,通常建议避免嵌套循环,因为它们可能很慢-因此,如果有更好的方法可以在列表上实现成对迭代(可能是
collections
中的某些东西),并且可以避免使用self和相互的比较,我都很高兴。 最佳答案
您可以将嵌套的for限制为从外循环中的下一项开始到当前项。这样,您只需对每个唯一的对象运行一次:
for i, s1 in enumerate(string_list):
for s2 in string_list[i+1:]:
ratios.append(hamming_distance(s1, s2))
return ratios
您可以将其放在列表中。
ratios = [(s1, s2, hamming_distance(s1, s2)) for i, s1 in enumerate(string_list)
for s2 in string_list[i+1:]]
您可以将字符串放在元组中,作为结果的一部分,就像我在list comp中所做的那样。
关于python - 嵌套循环,避免自我和倒数比较,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44905155/