为每个fi的姓写上三个条目

2024-04-20 06:37:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个文件中有以下数据:

Sarah,10
John,5
Sarah,7
Sarah,8
John,4
Sarah,2

我想为每个人保留最后三排。输出将是:

^{pr2}$

在本例中,Sarah的第一行被删除,因为后面的三行被删除。输出中的行也与输入中的行保持相同的顺序。我该怎么做?在

附加信息 你们太棒了-非常感谢。最后的代码似乎已经从这篇文章中删除了-

import collections

with open("Class2.txt", mode="r",encoding="utf-8") as fp:
    count = collections.defaultdict(int)
    rev = reversed(fp.readlines())
    rev_out = []

    for line in rev:
        name, value = line.split(',')
        if count[name] >= 3:
            continue
        count[name] += 1
        rev_out.append((name, value))

out = list(reversed(rev_out))

print (out)

Tags: 文件数据namevaluecountlinerevout
1条回答
网友
1楼 · 发布于 2024-04-20 06:37:13

因为这看起来像csv数据,所以使用csv模块来读写它。在读取每一行时,存储按第一列分组的行。将行号与行一起存储,以便可以按照与输入相同的顺序写出行号。使用绑定deque只保留每个名称的最后三行。最后,对行进行排序并写出它们。在

import csv

by_name = defaultdict(lambda x: deque(x, maxlen=3))

with open('my_data.csv') as f_in
    for i, row in enumerate(csv.reader(f_in)):
        by_name[row[0]].append((i, row))

# sort the rows for each name by line number, discarding the number
rows = sorted(row[1] for value in by_name.values() for row in value, key=lambda row: row[0])

with open('out_data.csv', 'w') as f_out:
    csv.writer(f_out).writerows(rows)

相关问题 更多 >