首页 > 解决方案 > 计算列表中可能的相同字母配对数

问题描述

我希望计算动态列表中相同字母对的数量。例如my_list = ['A','A','B','B','C','C'],有 3 种可能的配对,A因为 1 对有 2 个B,第二对有 2 个C,第三对有 2 个。以列表为例,如果有 5 个A,则计为 2 对(2 组对A

为此,我编写了一些冗长且不优雅的代码,如果存在奇数元素列表,这些代码将不起作用。因此,我想知道是否有更简单易读的解决方案。

my_list = ['A','A','C','C', 'D', 'D']

total_letters = len(my_list)
unpairable_letter = 0

frequency = {}

# Count frequency of each letter in list 
for letter in my_list:
    frequency[letter] = frequency.get(letter, 0) + 1

for value in frequency.values():
    if value == 1:
        unpairable_letter += 1
        
    if value > 2: 
        if value % 2 != 0:
            unpairable_letter += 1
        
print(total_letters/2 - unpairable_letter)

标签: python

解决方案


您可能可以使用groupbyfromitertools模块查找字母组,然后获取分组的长度和 int 除以 2。defaultdictfromcollections模块只是一个字典,其中新键具有默认值和类型。

from itertools import groupby
from collections import defaultdict

my_list = ['A','A','C','C', 'D', 'D']

frequency = defaultdict(int)

for x, g in  groupby(my_list):
    frequency[x] += len(tuple(g)) // 2

frequency
# returns:
defaultdict(int, {'A': 1, 'C': 1, 'D': 1})

如果一系列连续的字母是奇数,它将向下舍入。所以5个字母是2组。

from itertools import groupby
from collections import defaultdict

my_list = ['A','A','A','A','A','C','C','D','D','C','C']

frequency = defaultdict(int)

for x, g in  groupby(my_list):
    frequency[x] += len(tuple(g)) // 2

frequency
# returns:
defaultdict(int, {'A': 2, 'C': 2, 'D': 1})

没有进口:

在没有导入的情况下执行此操作需要遍历列表,检查列表中的元素是否已更改,然后将长度相加。

my_list = ['A','A','A','A','A','C','C','D','D','C','C']
frequency = {}

candidate = my_list[0]
count = 0

for x in my_list:
    if x == candidate:
        count += 1
    else:
        frequency[candidate] = frequency.setdefault(candidate, 0) + count // 2
        candidate = x
        count = 1

frequency
# returns:
{'A': 2, 'C': 1, 'D': 1}

推荐阅读