1

我对 Python 很陌生,我一直在为我的程序构建逻辑。我想学习,但我觉得我需要一些外部帮助。也许你们可以帮助我。这是家庭作业/项目。

list (SalesData.txt)看起来像这样:

  • 名称 1
  • 23
  • 34
  • 454
  • 名称 2
  • 344
  • 34
  • 45

它至少有 5 个不同的名称。但是对于这个例子,这会做。

基本上,我需要得出所有数字的总和,然后是每个名字的总和。

输出:: 在这种情况下(使用示例)

  1. 总计 = 934(所有数字的总和)
  2. 名称 1 总计 = 511(名称 1 的数字总和)
  3. 名称 2 总计 = 423(名称 2 的数字总和)

我知道如何获得仅包含数字的文件的总和,但是当涉及到混合时,我很困惑。另外,我如何指定获取每个"name". 我应该使用.isdigit()and.isalpha()来告诉列表什么时候求和什么时候不求和?

任何建议都会帮助我!谢谢!

更新 这是我到目前为止的代码:

data = []
data = open("SalesData.txt").read().split()
    for i in data:
        s = sum([ float(i) ])
print "Sum=" , s
print "Avg="  , s/len(data)

这仅在文件全为数字时才有效,这很容易对内容进行求和。但请记住,我每 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')如果它不是一个字符串,它会做常规的数字总和。我当时正在使用这个程序,我希望能够使用提供的混合列表来获得数字的总和,但是我在将字符串分析为字符串和将浮点数分析为浮点数方面陷入困境。

4

4 回答 4

3

请注意,如果您有一个非整数或负值(例如 342.2 或 -342), .isdigit()它将返回,因此这可能不是一个好的机制。False

正如 Kreativitea 所指出的,int()它可用于从数字(特别是整数)中区分单词,但考虑到float()当数字可能是整数或浮点数时,这将适用于更一般的情况。

于 2012-12-01T19:28:07.740 回答
2

由于这是家庭作业,我将仅提供一般指导。

  1. 您不需要使用 isdigit 或 isalpha。当您尝试int()在不是整数的东西上使用 an 时会发生什么?好的,现在您有了一个区分两组的过程。
  2. 数字列表后面是否总是有相同数量的项目?如果没有,while循环可能是个好主意。
  3. 在任何一种情况下,数据的质量如何,例如用抽象术语描述数据。哪些数据结构可以很好地映射到这种数据?
  4. 分解过程;最好创建两个易于阅读的函数,而不是创建一个难以阅读的函数。

祝你好运。:)

于 2012-12-01T19:12:25.017 回答
0

关于更新#2:这里有几个逻辑问题。

首先,if str(i):并不意味着“如果i是一个字符串,......”。它的意思是“从创建一个字符串i;现在,如果结果字符串是非空的,......”。

其次,i来自data,它是文件的行列表。所以它必须是一个字符串。这就是您读取文件时所得到的。除非您告诉程序,否则不会尝试将各种符号解释为数字。

第三,当这样的转换失败时,它将通过引发异常而失败。你不能用一个if块来测试它。你必须使用try/except异常处理。

s第四,每次得到一个数字时,您都在尝试计算,使用只有该数字的一个元素列表。这不会给你所有数字的总和。如果你想把几个数字相加,你必须先把这些数字放在一起。

第五,您使用len(data)数字计数来除以总和。这是错误的,因为这是文件中的行数,并且您已经说过其中一些可能被排除在外。您只想计算数字,这再次需要先将该列表放在一起。

sum先写一些可以给你数字列表的东西,然后使用and与该列表一起使用很简单len(每次一次,在循环之外)。

于 2012-12-01T20:24:31.083 回答
0

假设名称是唯一的,您可以从文件中填充一个字典,以便键是名称,值是数字列表。然后很容易获得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

这不是完整的代码,因为它是一个家庭作业问题。另请注意,您可能需要正确处理您在第一行读到的名字。

于 2012-12-01T19:08:55.693 回答