我正在尝试对文本文件内容进行一些计算和分组。我已经对数据进行了分组,但仍然存在问题,而且我无法弄清楚如何对最后一个字段(金额列)执行计算。
from collections import defaultdict
data=defaultdict(int)
with open('datafile.txt') as f:
for line in f:
group, score, team = line.split(maxsplit=2)
data[(group.strip(),team.replace('\n','').strip())]+=int(score)
sorteddata = sorted([[k[0],v,k[1]] for k,v in data.items()], key=lambda x:x[1], reverse=True)
for subl in sorteddata:
print(" ".join(map(str, subl)))
datafile.txt(项目,交易,金额)
alpha 1 54,00.01
bravo 3 500,000.00
charlie 1 27,722.29 ($250.45)
charlie 10 252,336,733.383 ($492.06)
delta 2 11 ($10)
echo 5 143,299.00 ($101)
echo 8 145,300 ($125.01)
falcon 3 0.1234
falcon 5 9.19
lima 6 45.00181 ($38.9)
romeo 12 980
想要的输出:#-- 排序、分组和计算
echo 13 288,599.00 ($226.01) #-- grouped and calculated
romeo 12 980
charlie 11 252,364,455.673 ($742.51) #-- grouped and calculated
falcon 8 9.3134 #-- grouped and calculated
lima 6 45.00181 ($38.9)
bravo 3 500,000.00
delta 2 11 ($10)
alpha 1 54,00.01
当前输出:#-- 部分正确
romeo 12 980
charlie 10 252,336,733.383 ($492.06)
echo 8 145,300 ($125.01)
lima 6 45.00181 ($38.9)
echo 5 143,299.00 ($101)
falcon 5 9.19
bravo 3 500,000.00
falcon 3 0.1234
delta 2 11 ($10)
alpha 1 54,00.01
charlie 1 27,722.29 ($250.45)
这里有很多问题,但最重要的是,您希望为每个团队添加三个单独的值,其中一些在您的代码中显然是可选的。只是拆分、分组、添加并希望获得最佳效果并不会削减它。
编码时,始终考虑整个问题,并在编码时尝试在脑海中想象/想象这个过程。每一行代码都应该对应于你想要发生的具体事情。在编码中不要“尝试一下”。
看起来您试图通过设置 a 来覆盖可选的最后一列maxsplit
,但您仍然需要处理最后一个字段,因为您期望它在输出中。
Python也无法自动处理类似的东西($38.9)
并将其理解为数值 - 您必须告诉它。
我假设输入54,00.01
是一个错字,并且应该阅读,54,000.01
因为您使用的是普通的英语数字?
这是您的程序的一个版本,与您编写的有效版本有些接近:
data = {}
with open('datafile.txt') as f:
for line in f:
parts = line.split()
team, a, b, c = parts if len(parts) == 4 else parts + ['($0)']
data[team] = tuple(map(sum, zip((int(a), float(b.replace(',', '')), float(c[2:-1].replace(',', ''))), data.get(team, (0, 0, 0)))))
data = {t: (a, b, c) for a, b, c, t in reversed(sorted((a, b, c, t) for t, (a, b, c) in data.items()))}
for team, (a, b, c) in data.items():
print(f'{team:8} {a:4} {b:,} (${c:,})')
还需要进行一些更改,您可以看到c
最终为 0 的值仍被打印出来,但修复问题由读者决定。结果:
echo 13 288,599.0 ($226.01)
romeo 12 980.0 ($0.0)
charlie 11 252,364,455.67299998 ($742.51)
falcon 8 9.3134 ($0.0)
lima 6 45.00181 ($38.9)
bravo 3 500,000.0 ($0.0)
delta 2 11.0 ($10.0)
alpha 1 54,000.01 ($0.0)
关于解决方案的一些说明:添加是用这一行完成的:
data[team] = tuple(map(sum, zip((int(a), float(b.replace(',', '')), float(c[2:-1].replace(',', ''))), data.get(team, (0, 0, 0)))))
这是通过获取现有元组,或者(0, 0, 0)
如果它不存在(而不是使用defaultdict
)来实现的。它是与当前行上的值的元组元组的 zip,根据需要将这些值从字符串形式转换为数字形式。然后sum
函数被映射到来自两个元组的值对(添加它们),最后,它再次变成元组的结果。
您似乎是按“a”排序,但我假设如果两个团队在那里具有相同的值,您可能希望按两个数字和团队名称相同的所有内容进行排序:
data = {t: (a, b, c) for a, b, c, t in reversed(sorted((a, b, c, t) for t, (a, b, c) in data.items()))}
这是通过获取生成的字典,将其转换为元组,对它们进行排序,反转结果然后再次将其转换为字典来工作的(尽管您当然也可以获取元组列表并打印它们)
以漂亮的格式打印是干净的:
print(f'{team:8} {a:4} {b:,} (${c:,})')
这是一个所谓的 f 字符串,它负责用逗号格式化浮点数,以及为示例输出中的列设置特定大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句