Python:获取Python中获得的计数总和
我是一个初学者,每天都在努力学习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
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())