most_common()的Python计数器意外结果.这是python中的一个bug吗



我遇到了意外的结果。我不明白为什么当我使用集合时会发生这种情况。计数器

我使用python 3.8

from collections import Counter
counter = Counter()
counter["تمباکو"] = +1
print(counter.most_common())

输出:

[('تمباکو', 1)]

根据文档,它应该返回(关键字,计数(对

当我试图将counter.most_common((的输出写入csv时,它也会更改数据的顺序:

writer = csv.writer(f)
writer.writerows(counter.most_common())

它按行对(计数、关键字(输出

但当你运行时:

counter.most_common()[0][0]

它将输出:

'تمباکو'

看起来一切都很好,因为关键字是第一位的。

出了问题,我不明白。

详细阐述我的评论:

这不是Python,而是您的输入。

下面是一个合成示例,它有一个包含U+202ERIGHT-TO-LEFT OVERRIDE的字符串(幽默地说,这也影响了链接页面上的渲染(。

from collections import Counter
s = "u202Ehello"
c = Counter()
c[s] += 1
for word, count in c.most_common():
print(word, count)

当我运行这个时,我的终端显示

‮hello 1

因为202E字符覆盖渲染顺序。

如果我删除202E字符,我会得到

hello 1

正如预期的那样。

一种打印具有这种覆盖字符的字符串的方法;脱芳的";方法是使用repr()(当然还有它自己的注意事项(:

for word, count in c.most_common():
print(repr(word), count)

打印

'u202ehello' 1

因为冒犯的控制字符是转义的。

相关内容

最新更新