У меня есть список слов, и с помощью python3 я подсчитываю разницу в буквах между каждой комбинацией слов (используя умный алгоритм diff_summing с этого сайта ):
import itertools
def diff_letters(a,b):
return sum ( a[i] != b[i] for i in range(len(a)) )
w = ['AAHS','AALS','DAHS','XYZA']
for x,y in itertools.combinations(w,2):
if diff_letters(x,y) == 1:
print(x,y)
Это печатает:
AAHS AALS
AAHS DAHS
Мой вопрос: Как мне подсчитать и запись о том, что строки «DAHS» и «AALS» имеют ровно одного партнера, и «AAHS»имеет двух партнеров? Я буду фильтровать для направленных комбинаций, где у каждого target_string
есть ровно один near_matching_word
, поэтому мои окончательные данные (в виде JSON) будут выглядеть так:
[
{
"target_word": "DAHS",
"near_matching_word": "AAHS"
},
{
"target_word": "AALS",
"near_matching_word": "AAHS"
}
]
(заметив, что AAHS не отображается как target_word
)
У меня есть одна версия, использующая functools.reduce
import itertools
import functools
import operator
def diff_letters(a,b):
return sum ( a[i] != b[i] for i in range(len(a)) )
w = ['AAHS','AALS','DAHS','XYZA']
pairs = []
for x,y in itertools.combinations(w,2):
if diff_letters(x,y) == 1:
#print(x,y)
pairs.append((x,y))
full_list = functools.reduce(operator.add, pairs)
for x in full_list:
if full_list.count(x) == 1:
print (x)
, которая печатает
AALS
DAHS
но тогда мне придется вернуться к моему большому списку pairs
, чтобы найти near_matching_word
. Конечно, в моей окончательной версии список pairs
будет намного больше, и target_word
может быть первым или вторым элементом в кортеже (x, y).