【问题标题】:Odd Python dictionary and string behavior奇怪的 Python 字典和字符串行为
【发布时间】:2014-03-21 11:22:22
【问题描述】:

我正在为一门涉及计算双字母对频率的课程做作业。我们将自己实现它,而不是使用许多具有强大版本的库中的任何一个。

分配很简单,但是在构建我的模型时,我在尝试迭代键时看到了一些非常奇怪的行为,并且我遇到了一个 Python 问题。我只是将文本拆分为字符列表,然后将每个二元组及其频率存储在dict 中。所以dict 类似于{ 'aa': 7, 'ab' : 9, ... }。很简单,我想。

尝试遍历 dict 以探索数据,我使用了一个简单的 for 循环,例如:

for k in frequencies:
    print 'bigram: %s frequency: %s' % (k, frequencies[k])

这适用于大多数二元组,但在整个输出中都有一些行输出非常奇怪,如下所示:

bigram: Ab frequency: 14
bigram: e; frequency: 29
frequency: 4
bigram: l? frequency: 4
bigram: -p frequency: 1
A frequency: 36

如您所见,有许多行没有打印整个格式化字符串。

我尝试通过在构建它们时打印出二元组的每个字母来调试它,如下所示:

print 'letter one:  |' + first_letter + '| letter two: `' + second_letter + '`'

这会导致几行相同的奇数输出,其中我的输出字符串的第一部分被忽略:

letter one:  |t| letter two: `.`
`
| letter two: `T`
letter one:  |T| letter two: `h`

执行此操作时,我注意到似乎是 . 字符在某些(但不是所有)情况下导致了这些问题,因此我修改了二元组解析器以跳过包含非字母数字字符的二元组,但也遇到了同样的问题。看起来some_dict['.T'] 应该没问题,密钥是可散列的,等等。

我的问题:为什么输出(看似)被破坏了?什么可能导致这些格式字符串的第一部分被忽略?

如果重要,请使用 Python 2.7.5。 Mac OS X 和 Ubuntu 12.04 上的输出相同。

【问题讨论】:

  • 不应该是 { 'aa': 7, 'ab': 9, ...} 我认为你缺少引号
  • 向我们展示您正在使用的数据,如果它不是人类的字典,您可以print frequencies
  • @sshashank124 我只是把它放在那里来说明字典的结构,但是很好。编辑以包含引号。

标签: python string dictionary


【解决方案1】:

您的二元组中有控制字符,它们要么清除行,要么将打印位置返回到行的开头(通常是ASCII codepoint 0x0D\r、回车)。

使用%r 代替打印字符串文字表示,其中控制字符替换为它们的python 字符串转义码:

for k in frequencies:
    print 'bigram: %r frequency: %s' % (k, frequencies[k])

作为旁注,您可能需要查看collections.Counter() 以收集二元组频率;它是dict 的子类,增加了一些细节,例如为您计算频率和列出最常见元素的方法(按排序顺序)。

【讨论】:

  • 知道了,谢谢。不知道%r;这是一个方便的技巧。也感谢关于Counter() 的提示。
猜你喜欢
  • 2021-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多