由于这肯定是很常见的情况,所以我想知道以下情况是否有任何预先存在的解决方案。

可以说我有一组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/

10-12 22:03