2

私は毎日Pythonに苦労している初心者です。2 列目に動物の名前を持つ大きなデータ セットがあります。各動物の数を名前で合計するプログラムがあります(各行には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を超えるすべてのカウントデータのようです桁が分かれています。たとえば、出力を印刷すると、次のようになります。

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

それ以外の

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

ここでやりたいことは、これらの要素の単一の「合計」を取得することです。ここでは4になります。4種類の動物。

これが上記のエラーが発生する理由である可能性があると考えています。私は間違っているかもしれませんが、誰かがこの問題を解決する方法を教えてくれませんか? 事前に助けてくれてありがとう!

4

4 に答える 4

3

使う必要はないと思います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)
于 2012-08-03T17:29:15.707 に答える
2

(コメントの議論に従って書き直しました。元の回答は、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あり、すべての要素が含まれるジェネレーターが生成されます (ファイルに 5 行ある場合1、同様のリストになります)。[1,1,1,1,1]
  • if line.strip() != ''これは、ジェネレータ式の 2 番目の部分です。1行に何かがある場合にのみaがジェネレーターに追加されるようにします。
  • -1sum(...)csv のヘッダーを無視するために、戻り値から 1 が減算されます

これが何らかの形で役立つことを願っています。繰り返しますが、この方法は手っ取り早い汚いアプローチです。たとえば、データで他のことをしている場合は使用しません。

于 2012-08-03T17:24:54.600 に答える
2

カウントの取得

問題は、「カウント」と「合計」を区別しているという事実に起因すると思います。「カウント」、その 1 つのアイテムの出現回数の合計です。さらに、あなたは を誤用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()で累積加算を実行するだけです。

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

この場合totalint(値 0) でitemあり、str(値 '1') です。Python は をどうするかわかりません0 + 'string'

于 2012-08-03T17:28:52.957 に答える
0

最初に Counter オブジェクトを使用していますが、defaultdict の代わりとしてのみ使用します。カウントを行うためにそれを使用したい場合は、次のような入力を渡すことができます (種が複数回出現し、各種が出現する頻度を知りたいと仮定します):

counts = collections.Counter(map(lambda item: item[0], reader))

しかし、すべての動物の合計を (種に関係なく) カウントしたい場合は、最初のループにそのカウントを追加する必要があります。そして他の人が言ったように、文字列を読んでいるので、最初にその数から整数を作る必要があります。

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())
于 2012-08-03T17:52:34.373 に答える