奇怪的Python字典和字符串行为

时间:2014-03-21 11:22:23

标签: python string dictionary

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

赋值很简单,但在构建我的模型时,我在尝试迭代键时看到了一些非常奇怪的行为,我有一个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`

这样做,我注意到它似乎是.个字符导致某些问题,但不是所有情况,所以我修改了两字母分析器以跳过包含非字母数字字符的bigrams,但得到了相同的的问题。似乎some_dict['.T']应该没问题,关键是可以清洗等等。

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

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

1 个答案:

答案 0 :(得分:3)

您的双字母组中有控制字符可以清除该行,或将打印位置返回到行的开头(通常为ASCII codepoint 0x0D\r,CARRIAGE RETURN)。

使用%r来打印字符串文字表示,而不是用python字符串转义码代替控制字符:

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

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