Python:获取Python中获得的计数之和

2024-05-16 08:58:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个每天与Python搏斗的初学者。我有一个很大的数据集,在第二栏有动物的名字。我有一个程序来计算每只动物的名字(每一行有一个动物名字和一个“计数”数据)。我试图得到我使用Python获得的那些计数数据的总和,但是我无法做到这一点。我目前掌握的代码是:

import csv, collections

reader=csv.reader(open('C:\Users\Owl\Data.txt','rb'), delimiter='\t')

counts=collections.Counter()

for line in reader:
   Name=line[1]
   counts[Name]+=1

for (Name, count) in sorted(counts.iteritems()):
   Output=list('%s' % count) #Make output string to a list
   Sum=sum(Output) # Sum function requires a list
   print 'Total kinds of Animals: %s' % Sum

我在说" File "sum_count.py", line 17, in <module> Sum=sum(Output) # Sum function requires a list TypeError: unsupported operand type(s) for +: 'int' and 'str'".时出错

到目前为止,我发现由于sum显然需要输入类型是列表,所以我将计数数据(原来是字符串)转换为列表,但是当我执行Output=list('%s' % count)时,似乎所有超过2位的计数数据都被拆分。例如,当我打印输出时,它将如下所示:

['1', '6', '3']
['3']
['1', '8', '5', '9']
['7', '9']

而不是

['163']
['3']
['1859']
['79']

我想做的是得到这些元素的一个“和”。这里是4点。四种动物。

我想这可能是我犯上述错误的原因。我可能错了,但有人能帮我解决这个问题吗?提前谢谢你的帮助!


Tags: 数据nameinforoutputcountline名字
3条回答

获取计数

我认为问题的根源在于你把“数”和“总数”区分开来。“count”是该项的出现总数。另外,你误用了collections.Counter(),它可以使你的工作变得更容易。下面是一个代码示例,说明我认为您正在努力实现的目标:

counts = collections.Counter(line[1] for line in reader if len(line) > 1)
#Now all the occurrences of each item are summed up, AND ordered by number of occurrences

print "Total number of animals: %d" % len(counts)
#This is what I THINK you are trying to do. 

另外:

for name, number in counts.items():
    print "# of %s: %d" % (name, number)

关于你的“TypeError”:

你有一个字符串列表,而不是整数列表。

例如:

mylist = ['1', '2', '3']

所有的sum()都是对iterable执行累积加法,类似于:

total = 0
for item in mylist:
    total = total + item

在本例中,total是一个int(值0),而item是一个str(值“1”)。Python不知道如何处理0 + 'string'

(在评论讨论后重新编写;最初的回答只是指出OP试图添加字符串。)

其他答案有更多的扩展机会(因此我建议您这样做),但是如果您只想快速计算动物类型的数量,您可以简单地计算文件中的行数,并使用您对文件结构的知识。例如,如果csv文件的头像Name, Count, etc.一样,后面紧跟着你感兴趣的数据,那么动物的数量就是文件中非空行的数量,头的数量是1。然后可以使用以下代码打印计数:

print sum(1 for line in open('test.csv') if line.strip() != '') - 1

下面是代码的每个部分的作用:

  • sum()添加列表中的所有元素。在这种情况下,里面没有一个列表,而是一个生成器表达式,这里可以把它看作一个不在内存中的列表。
  • 1 for line in open('test.csv')这是生成器表达式的第一部分。它本身会生成一个生成器,其长度是test.csv中的行数,其中每个元素都是1(如果文件中有五行,则类似的列表是[1,1,1,1,1])。
  • if line.strip() != ''这是生成器表达式的第二部分。它确保只有当线路上有任何内容时,1才会添加到生成器中。
  • -1从值中减去一个sum(...)返回忽略csv的头

好吧,我希望这在某种程度上有所帮助,我应该重申,这种方法只是一种快速而肮脏的方法;例如,如果您正在使用数据做其他事情,您就不会使用它。

我认为你不需要使用sum

试试这个:

for (Name, count) in sorted(counts.iteritems()):
    print 'Species total: %s' % count

或者,可能更好:

for (Name, count) in sorted(counts.iteritems()):
    print 'Total for species %s: %s' % (Name, count)

sum用于当您有一个数字列表并希望找到该数字列表的总和时。 您已经使用counts收集了每个动物的总数——您只需要显示它。

编辑

要总结统计的动物总数,可以执行以下操作:

total = sum(counts.values())
print 'Total number of animals: %d' % total

编辑2

计算的动物种类数只是counts字典的长度:

print 'Number of kinds of animals: %d' % len(counts)

相关问题 更多 >