文件中组合元素的总和

时间:2012-12-01 19:05:19

标签: python list text

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

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

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

至少有5个不同的名字。但是对于这个例子,这样做。

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

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

  1. 总计= 934(所有数字的总和)
  2. 名称1总计= 511(名称1的数字总和)
  3. 名称2总计= 423(名称2的数字总和)
  4. 我知道如何得到一个包含唯一数字的文件的总和,但是当涉及混合物时我很困惑。另外,如何指定获取每个"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')如果它不是字符串,它将执行常规的数字总和。我当时正在使用这个程序,我希望能够使用混合提供的列表获得总数的数字,但我仍然坚持将字符串分析为字符串并浮动为浮点数。

4 个答案:

答案 0 :(得分:3)

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

正如Kreativitea所指出的那样,int()可用于从数字中识别单词(特别是整数),但考虑到float()在数字可能是整数或浮点时更常见的情况下会起作用

答案 1 :(得分:2)

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

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

答案 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)作为数字的计数来除以总和。这是错误的,因为这是文件中的行数,并且您已经说过可能会排除其中一些行。您只想计算数字,这又需要先将该列表放在一起。

首先编写可以为您提供数字列表的内容,然后将sumlen与该列表一起使用(在循环之外各使用一次)。