【发布时间】:2017-09-27 07:53:20
【问题描述】:
为了有效地获取字母的频率(给定字母表 ABC 在字典中的字符串 code 我可以制作一个函数 a-la (Python 3):
def freq(code):
return{n: code.count(n)/float(len(code)) for n in 'ABC'}
然后
code='ABBBC'
freq(code)
给我
{'A': 0.2, 'C': 0.2, 'B': 0.6}
但是我怎样才能得到不等长度字符串列表中每个位置的频率呢?例如mcode=['AAB', 'AA', 'ABC', ''] 应该给我一个嵌套结构,如字典列表(其中每个字典是每个位置的频率):
[{'A': 1.0, 'C': 0.0, 'B': 0.0},
{'A': 0.66, 'C': 0.0, 'B': 0.33},
{'A': 0.0, 'C': 0.5, 'B': 0.5}]
我无法弄清楚如何在所有字符串中计算每个位置的频率,并将其包装在列表理解中。受到其他 SO 字数统计的启发,例如讨论得很好的帖子Python: count frequency of words in a list 我相信collections 的计数器模块可能会有所帮助。
这样理解 - 将 mcode 字符串写在不同的行上:
AAB
AA
ABC
那么我需要的是 dict 列表中字母 ABC 的按列频率(AAA、AAB、BC),其中每个列表元素是每列 ABC 的频率。
【问题讨论】:
-
我不太明白你的例子。第一个字符串 'AAB' 的输出应该是 {'A': 0.66, 'C': 0.0, 'B': 0.33}?此外,您的字符串 (ABC) 中是否总是最多有 3 个不同的字母?
-
频率中的第一个位置是在 AAA 上计算的,在位置 2 它的 AAB 在位置 3 的 BC 上。那有意义吗 ?在单独的行上对齐单词,然后沿列查找频率。
-
您可以使用
itertools.zip_longest(*mcode)并在此循环上使用您的freq。不过,您必须更改len(code)以反映正确的长度。 -
顺便说一句:在 Python 3 中,您不需要
float()。 -
@Allen 你现在明白了吗? - 查看我的更新(我写的是每个位置的频率)
标签: python dictionary list-comprehension frequency letter