【发布时间】:2012-08-03 17:21:30
【问题描述】:
我是一个每天都在与 Python 苦苦挣扎的初学者。我有一个大型数据集,第二列中有动物名称。我有一个程序可以按每个动物的名称来计算每个动物的数量(每行有 1 个动物名称和 1 个“计数”数据)。我正在尝试获取使用 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 位的计数数据都被拆分。比如我打印Output的时候是这样的:
['1', '6', '3']
['3']
['1', '8', '5', '9']
['7', '9']
而不是
['163']
['3']
['1859']
['79']
我想要在这里做的是获得这些元素的单一“总和”。这里是 4. 四种动物。
我认为这可能是我收到上述错误的原因。我可能错了,但有人可以帮我解决这个问题吗?提前感谢您的帮助!
【问题讨论】:
-
为什么你想要
['163']形式的对象而不是163?sum()确实 要求输入类型为列表,但我认为您的列表构造错误。此外,字符串是可迭代的,当您执行list(some_string)时,它会将字符串转换为字符列表。 -
你是对的。我只想要一个形式为 163 的对象。在这种情况下,我希望 Python 执行 163+3+1859+79。有什么办法吗?
-
对不起,我的意思是 4。我再次编辑了问题。很抱歉让你感到困惑......
-
@JoelCornett
sum() does require the input type to be a list- 不正确 - 它要求它的参数是任何可迭代的。 -
@JonClements:我的错误。这就是我的意思,但你说得对,我不能互换使用这些术语。