【问题标题】:Python, probabilityPython,概率
【发布时间】:2011-05-24 06:11:35
【问题描述】:

接下来是我的代码:

with open("test.txt") as f_in:
    for line in f_in:
        for char in line:
            frequencies[char] += 1

list= [(count, char) for char, count in frequencies.iteritems()]

这段代码打开test.txt,读取每一行并将“list”符号转换成例如:[(3, 'a'),........ .]。这意味着在整个文本文件中,有三个 a 等等......

我需要计算这个数字,而不是 3,我需要 [3 / 所有符号的数量]。所以我不需要文本中有多少个符号,例如 a 是多少,但我需要符号 a 的概率。

所以如果在text(test.txt)中会有"aaab",我需要输出"list":[(0.75, 'a'), (0.25, ' b')]

非常感谢您的帮助。


EDIT2

import collections
frequencies = collections.defaultdict(int)



with open("test.txt") as f_in:
    for line in f_in:
        for char in line:
            frequencies[char] += 1
total = float(sum(frequencies.keys()))

verj= [(count/total, char) for char, count in frequencies.iteritems()]

这不起作用,给我错误:

total = float(sum(frequencies.keys()))

TypeError: +: 'int' 和 'str' 的操作数类型不受支持

【问题讨论】:

  • 我假设您正在将 frequencies 初始化为 0 值?考虑使用collections.defaultdict
  • 那应该是 frequencies.values() 在编辑的行上,而不是 frequencies.keys()。毕竟,它是存储出现次数的那个字典的值。 (键存储字符符号。)

标签: python list char line probability


【解决方案1】:

如果frequencies = {"a": 3, "b": 4} 那么frequencies.values() 给我们[3, 4],我们可以计算总和:

total = float(sum(frequencies.values()))

然后是概率:

probs = [(count / total, char) for char, count in frequencies.iteritems()]

请注意,Python 在将两个整数相除时返回一个整数,这就是我首先将总和转换为浮点数的原因:

Python 2.7(r27:82508,2010 年 7 月 3 日,21:12:11) [GCC 4.0.1 (Apple Inc. build 5493)] 在达尔文 键入“帮助”、“版权”、“信用”或“许可”以获取更多信息。 >>> 3 / 4 0 >>> 3 / 4.0 0.75

【讨论】:

  • 好的,我明白这一点,但 python 给我一个错误:total = float(sum(frequencies.keys())) TypeError: unsupported operand type(s) for +: 'int' and ' str'
  • 是的,因为您要对 keys(字母)而不是 values(计数)求和。您不能在字母中添加字母:)
  • 请查看编辑 2,您能否修复此代码以使其正常工作?非常感谢
  • 是的,只要把“keys”这个词改成“values”,我已经说了大约 3 次了 :)
【解决方案2】:

你快到了。

with open("test.txt") as f_in:
    for line in f_in:
        for char in line:
            frequencies[char] += 1
total = float(sum(frequencies.values()))
symbols = [(count/total, char) for char, count in frequencies.iteritems()]

请注意,我已重命名您的结果列表,因为 list 是内置函数的名称,您不应使用它来命名变量或函数。

【讨论】:

  • 您需要对值求和,而不是对键求和。此外,如果数字是整数,那么您需要将 float() 应用于总数,以便除法产生浮点数。
  • total = sum(frequencies.keys()) TypeError: unsupported operand type(s) for +: 'int' and 'str' --->error, not working
  • 没错。对值而不是键求和,当您使用它时,将float() 应用于求和的结果,否则您的所有概率将向下舍入为零。
  • 能否请您添加答案“代码”,因为我真的不知道您的意思。谢谢
  • 不知道问题出在哪里?
【解决方案3】:

又快又脏:

   counter = 0
   with open("test.txt") as f_in:
        for line in f_in:
            for char in line:
                frequencies[char] += 1
                counter += 1

    list= [(count / counter, char) for char, count in frequencies.iteritems()]

【讨论】:

  • 不知道问题出在哪里?
  • Python 没有++ 运算符。请改用counter += 1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
  • 2018-11-19
  • 2016-04-12
  • 2018-01-09
  • 1970-01-01
相关资源
最近更新 更多