我对Python很陌生,而且我一直在为我的程序构建逻辑。我想学习,但我觉得我需要一些外部帮助。也许你们可以帮助我。这是家庭作业/项目。
list (SalesData.txt)
看起来像这样:
至少有5个不同的名字。但是对于这个例子,这样做。
基本上,我需要提出所有数字的总数,然后是每个名字的总数。
输出 ::在这种情况下(使用示例)
我知道如何得到一个包含唯一数字的文件的总和,但是当涉及混合物时我很困惑。另外,如何指定获取每个"name"
的总计。我应该使用.isdigit()
和.isalpha()
告诉列表何时求和以及何时不求和?
任何建议都会对我有所帮助!谢谢!
更新 到目前为止,这是我的代码:
data = []
data = open("SalesData.txt").read().split()
for i in data:
s = sum([ float(i) ])
print "Sum=" , s
print "Avg=" , s/len(data)
这只适用于文件全部为NUMBERS的情况,这很容易对内容求和。但请记住,我每12个数字处理一个字符串。我试图想办法只在它找到一条带浮点线的行时才进行求和。
更新#2
我还是想要一些指导!我开始以自己的方式把事情搞定,但我发现了一些非常基本的麻烦(我敢肯定)
data = []
data = open("SalesData.txt").read().split()
for i in data:
if str(i):
print 'This one is Letter'
elif float(i):
s = sum([ float(i) ])
print "Sum=" , s
print "Avg=" , s/len(data)
我知道这个例子不起作用,我想知道原因。我正在尝试分析清单。 如果'i'是一个字符串,程序将(在此示例中打印'Letter')如果它不是字符串,它将执行常规的数字总和。我当时正在使用这个程序,我希望能够使用混合提供的列表获得总数的数字,但我仍然坚持将字符串分析为字符串并浮动为浮点数。
答案 0 :(得分:3)
请注意,如果您有非整数或负值(例如342.2或-342),.isdigit()
将返回False
,因此这可能不是一个好用的机制。
正如Kreativitea所指出的那样,int()
可用于从数字中识别单词(特别是整数),但考虑到float()
在数字可能是整数或浮点时更常见的情况下会起作用
答案 1 :(得分:2)
由于这是家庭作业,我将只提供一般指导。
int()
时会发生什么?好的,现在你有一个可以识别两组之间的过程。 while
循环可能是个好主意。 答案 2 :(得分:0)
假设名称是唯一的,您可以从文件填充dict,以便键是名称,值是数字列表。然后,对于每个项目以及sum
总和,您将很容易获得sum
。
要构建一个dict,你需要组建一个简单的解析器。例如:
def parse(fname):
data = {}
numbers = []
for line in f:
# figure out if line has name or number
if ... # this is a number
numbers.append(float(line))
else:
data[name] = numbers
return data
这不是完整的代码,因为它是一个家庭作业问题。另请注意,您可能需要正确处理您在第一行读取的第一个名称。
答案 3 :(得分:0)
关于更新#2:这里有几个逻辑问题。
首先,if str(i):
并不意味着“如果i
是字符串,......”。这意味着“从i
创建一个字符串;现在,如果结果字符串非空,则......”。
其次,i
来自data
,这是该文件的行列表。所以它必须是一个字符串。这就是你读文件时得到的。在告诉程序 之前,不会尝试将各种符号解释为数字。
第三,当这样的转换失败时,它将通过引发异常而失败。您无法使用if
块进行测试。您必须使用try
/ except
异常处理。
第四,每次获得一个数字时,你都试图计算s
,只使用一个只有那个数字的元素列表。这不会给你所有数字的总和。如果你想总结几个数字,你必须先将数字放在一起。
第五,你使用len(data)
作为数字的计数来除以总和。这是错误的,因为这是文件中的行数,并且您已经说过可能会排除其中一些行。您只想计算数字,这又需要先将该列表放在一起。
首先编写可以为您提供数字列表的内容,然后将sum
和len
与该列表一起使用(在循环之外各使用一次)。