我遇到了意外的结果。我不明白为什么当我使用集合时会发生这种情况。计数器
我使用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
因为冒犯的控制字符是转义的。