即使字符串被反转,也计算列表中字符串的出现次数

问题描述

我有一个字母对列表,我需要在下一步中计算它们的出现次数,但它们的反面被认为是同一件事,因此“mo”和“om”将是“mo”的 2 次出现,依此类推- 我想我会把字符串列表转换成一个列表,在那里我反转字符串然后计算它们的出现次数,所以这个列表所以我可以有一个字典,它们出现的频率:

pairs = ['mo','om','mo','ab','ba','af','fa','fa']
counted_pairs = [pairs.count(i) for i in pairs]
my_dictionary = dict(zip(pairs,counted_pairs))

该改成这样:

pairs = ['mo','af']
counted_pairs = [pairs.count(i) for i in pairs]
my_dictionary = dict(zip(pairs,counted_pairs))

为了让我数数。

我想出了这个代码

pairs = ['mo','fa']
loop_pairs = []

for i in range(0,len(pairs)):
    word = pairs[i]
    for el in range(0,len(pairs)):
        if word == pairs[el]:
            loop_pairs.append(pairs[el])
        else:
            if word == pairs[el][::-1]:
                loop_pairs.append(pairs[el][::-1])

并且到目前为止它可以将反向对附加到新列表中,但是我需要删除其余的出现,因为它继续检查下一个对象并且因为我已经在第一轮外循环这不是我需要的了。

我希望这很清楚,谢谢!

解决方法

在计数前将每一对排序成一致的顺序:

>>> from collections import Counter
>>> pairs = ['mo','om','mo','ab','ba','af','fa','fa']
>>> counts = Counter("".join(sorted(p)) for p in pairs)
>>> counts
Counter({'ab': 5,'mo': 4,'af': 4})