Python Counter的most_common()返回结果异常,是否为Python本身的Bug?
核心原因
你遇到的不是Counter或者csv模块的逻辑问题,是双向文本渲染导致的视觉错觉:
Counter.most_common()的返回值永远符合官方定义的(元素, 计数)顺序,你直接取counter.most_common()[0][0]得到关键词就已经证明了内存中数据的顺序完全正确。- 你使用的关键词
تمباکو属于波斯语,是典型的RTL(从右向左书写)文本。当你用Excel、WPS表格这类默认支持双向文本排版的软件打开CSV时,软件会自动调整RTL文本所在行的显示顺序,让你视觉上以为计数在第一列、关键词在第二列,实际文件中存储的顺序并没有反转。
验证方案
你可以直接用Python读取你已经生成的CSV文件,打印每行内容就能确认存储顺序是正确的:
import csv # 替换为你的CSV文件路径 with open("test.csv", "r", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: print(row) # 输出结果会是 ['تمباکو', '1'],和你写入的顺序完全一致
修复办公软件显示顺序的方法
如果需要在Excel等软件中打开时也显示为「关键词在前、计数在后」的顺序,可以在写入时给RTL文本前添加左向控制符\u200E,强制软件按照从左到右的顺序渲染行内容,示例代码如下:
from collections import Counter import csv counter = Counter() counter["تمباکو"] = 1 processed_data = [("\u200E" + key, count) for key, count in counter.most_common()] # 用utf-8-sig编码避免Excel打开时出现小语种乱码 with open("output.csv", "w", encoding="utf-8-sig", newline="") as f: writer = csv.writer(f) writer.writerows(processed_data)
内容的提问来源于stack exchange,提问作者Przemek
相关产品推荐
相关产品推荐

