我是一个每天与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点。四种动物。
我想这可能是我犯上述错误的原因。我可能错了,但有人能帮我解决这个问题吗?提前谢谢你的帮助!
获取计数
我认为问题的根源在于你把“数”和“总数”区分开来。“count”是该项的出现总数。另外,你误用了
collections.Counter()
,它可以使你的工作变得更容易。下面是一个代码示例,说明我认为您正在努力实现的目标:另外:
关于你的“TypeError”:
你有一个字符串列表,而不是整数列表。
例如:
所有的
sum()
都是对iterable执行累积加法,类似于:在本例中,
total
是一个int
(值0),而item
是一个str
(值“1”)。Python不知道如何处理0 + 'string'
。(在评论讨论后重新编写;最初的回答只是指出OP试图添加字符串。)
其他答案有更多的扩展机会(因此我建议您这样做),但是如果您只想快速计算动物类型的数量,您可以简单地计算文件中的行数,并使用您对文件结构的知识。例如,如果csv文件的头像
Name, Count, etc.
一样,后面紧跟着你感兴趣的数据,那么动物的数量就是文件中非空行的数量,头的数量是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
。试试这个:
或者,可能更好:
sum
用于当您有一个数字列表并希望找到该数字列表的总和时。 您已经使用counts
收集了每个动物的总数——您只需要显示它。编辑
要总结统计的动物总数,可以执行以下操作:
编辑2
计算的动物种类数只是
counts
字典的长度:相关问题 更多 >
编程相关推荐