在文本文件内容中的某些项目中执行计算并将结果分组在python中

红豆

我正在尝试对文本文件内容进行一些计算和分组。我已经对数据进行了分组,但仍然存在问题,而且我无法弄清楚如何对最后一个字段(金额列)执行计算。

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在python中将内容分组到文本文件中

在python中读取和分组文本文件的内容

阅读文本文件中某些内容的推荐方法

如何从文本文件中连续计算结果

读入多行SQL文本文件并将其执行到Python程序中

计算文本文件中的不同单词:Shell和Python中的不同结果

如何在目录中的所有文本文件中搜索字符串并将找到的结果放在 Python 中的文本文件中

Python仅在文本文件中的某些位置执行操作

文本文件中的分组数据

列出python中文本文件中的某些行

如何获取多个动态文本文件的内容并将其存储在一个文本文件和mysql-Python 2.7中?

将文本文件的内容导入 Python 中的列表

Python计算文本文件中包含数字的行数

计算文本文件python中的每个单词

无法计算python中文本文件中的行数

使用python计算文本文件中单词的出现

Python:如何计算文本文件中的平均行长

删除文本文件中的内容

Python - 从文本文件访问列表中的项目

如何使python连续检查文本文件中的项目

如何计算文本文件中的行并将其存储在单个文件中?

如何在我的项目中添加文本文件,然后在代码中读取文本行?

计算文本文件中的模式

在文本文件中搜索项目

在python中对文本文件中的排序数据项进行分组和计算

如何在文本文件中搜索某些内容并在 python 中输出它的详细信息?

从项目中读取文本文件

比较两个文件并将结果打印到新的文本文件中

将正则表达式应用于文本文件并将结果保存在字典 python 中