我在文件中有以下数据:
Sarah,10
John,5
Sarah,7
Sarah,8
John,4
Sarah,2
我想为每个人保留最后三行。输出将是:
John,5
Sarah,7
Sarah,8
John,4
Sarah,2
在该示例中,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)
答案 0 :(得分:2)
由于这看起来像csv数据,请使用csv
模块进行读写。在读取每一行时,存储按第一列分组的行。将行号与行一起存储,以便可以保持与输入保持相同的顺序。使用绑定的双端队列仅保留每个名称的最后三行。最后,对行进行排序并将其写出来。
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)