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

Python:获取Python中获得的计数总和,python,count,sum,Python,Count,Sum,我是一个初学者,每天都在努力学习Python。我有一个很大的数据集,在第二列有动物的名字。我有一个程序,用它的名字来计算每只动物的数量(每行有一个动物名字和一个“计数”数据)。我试图获得使用Python获得的计数数据的总和,但我无法做到这一点。到目前为止,我掌握的代码是: import csv, collections reader=csv.reader(open('C:\Users\Owl\Data.txt','rb'), delimiter='\t') counts=collection

我是一个初学者,每天都在努力学习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
在sum=sum(Output)#sum函数需要一个列表类型错误:不支持+:'int'和'str'的操作数类型。

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

['1', '6', '3']
['3']
['1', '8', '5', '9']
['7', '9']
而不是

['163']
['3']
['1859']
['79']
这里我想做的是得到这些元素的一个“和”。这里是4点。四种动物

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

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

其他答案有更多扩展的机会(因此我推荐它们),但如果您只想快速计算动物类型的数量,您可以简单地计算文件中的行数,并使用您对文件结构的了解。例如,如果您的csv文件有一个标题,如
名称、计数等。
在下一行后面只跟有您感兴趣的数据,则动物的数量将是文件中非空行的数量,减去标题的1。然后,您可以使用以下代码打印计数:

print sum(1 for line in open('test.csv') if line.strip() != '') - 1
下面是该代码的每个部分的作用:

  • sum()
    将列表中的所有元素添加到其中。在这种情况下,里面没有列表,而是一个生成器表达式,这里可以认为它是一个没有进入内存的列表
  • 1表示行处于打开状态('test.csv')
    这是生成器表达式的第一部分。它本身将生成一个生成器,其长度是
    test.csv
    中的行数,其中每个元素都是
    1
    (如果文件中有五行,则类似列表将是
    [1,1,1,1,1]
  • if line.strip()!=“”这是生成器表达式的第二部分。它确保仅当线路上有任何内容时才将
    1
    添加到生成器中
  • -1
    从值中减去一
    总和(…)
    返回忽略csv的标题
嗯,我希望这在某种程度上有所帮助,我应该重申,这种方法只是一种快速而肮脏的方法;例如,如果您正在对数据进行其他处理,则不会使用它。

获取计数 我认为问题的根源在于你在区分“计数”和“总数”。“计数”是该项出现的总数。此外,您还误用了
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),而
是一个
str
(值“1”)。Python不知道如何处理
0+'string'

我认为您不需要使用
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
用于当您有一个数字列表并希望找到该数字列表的总和时。 您已经使用
计数收集了每只动物的总数
——您只需要显示它

编辑

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

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

所统计的动物种类数量仅为
计数
字典的长度:

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

首先使用计数器对象,但仅将其用作defaultdict的替代品。 如果您想使用它进行计数,您可以这样传递您的输入(假设物种出现不止一次,并且您想知道每个物种出现的频率):

但是如果你想计算所有动物的总数(不管物种),你必须在第一个循环中加上这个数字。正如其他人所说,既然你是在读字符串,你首先必须从这个数中得到一个整数

import csv

reader=csv.reader(open('in','rb'), delimiter='\t')

counts = dict()

for data in reader:
    animal = data[1]
    if animal not in counts:
        counts[animal]= 1
    else:
        counts[animal]+= 1

for animal in counts:
    print 'Animals of scpecies %s: %s' % (animal, counts[animal])   

print 'Species total: %s' % len(counts)
print 'All animals: %s' % sum(counts.values())

感谢您的快速回复!当我尝试“Output=int(“%s”%count)时,我得到一个错误“TypeError:“int”对象不可iterable”。我应该同时执行int和list吗?这不是一个好答案。确切地说,他会在哪里执行该转换?在他当前的体系结构中,他不能。他是python的初学者。你基本上是告诉他“重新构造代码,并确保在某个地方将其转换为int“。此外,你完全忽略了真正的问题,那就是他试图对字符串列表求和,即使它们是整数,也不应该求和。@PhillipSchmidt-True-我回答得太快了。”。当我看到owl对字符串列表求和并打算编辑答案以使其适合他/她的代码时,我立即做出了回应。当我做编辑时,其他人用同样的信息回答,所以我取消了它。另外,我误解了猫头鹰想要什么。我应该删除我的答案吗?@MatthewAdams我会试着编辑它,以正确的方式:)看看你是否能提出一个新的看法,如何正确地做。作为
import csv

reader=csv.reader(open('in','rb'), delimiter='\t')

counts = dict()

for data in reader:
    animal = data[1]
    if animal not in counts:
        counts[animal]= 1
    else:
        counts[animal]+= 1

for animal in counts:
    print 'Animals of scpecies %s: %s' % (animal, counts[animal])   

print 'Species total: %s' % len(counts)
print 'All animals: %s' % sum(counts.values())