0

サンプル入力がある場合:

Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,2

次のような出力を取得するにはどうすればよいですか。

Apples,7
Oranges,12

ありがとう。

編集:私はPython 3を使用しています

4

6 に答える 6

2

カウンターはこのために特別に設計されています。

# I'm assuming you have a list or iterable of lines like this
file="""Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,2""".split('\n')

# Here's the code under that assumtion
from collections import Counter
from functools import reduce
from operator import add
tally = reduce(add, (Counter({x[0]: int(x[1])}) for x in (x.split(',') for x in file)))

# To demonstrate
for name in tallies:
print('%s,%s' % (name, tallies[name]))
于 2012-08-14T20:46:36.060 に答える
2

defaultdict を使用します。

from collections import defaultdict

d=defaultdict(int)
with open('inputfile') as f:
    for line in f:
        fruit,num = line.split(',')
        #could also use `fruit,num,*rest = line.split(',')` 
        #for a little more robustness at the expense of 
        #backward compatability
        d[fruit]+=int(num)

モジュールを使用してファイルから列を解析することもできcsvますが、この例ではやり過ぎに思えました。

于 2012-08-14T20:44:52.900 に答える
0
strs="""Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,2"""

dic={}
for x in strs.split():
    key=x.split(',')[0]
    val=int(x.split(',')[1])    
    dic[key]=dic.get(key,0)+val

print(dic)  #prints {'Apples': 7, 'Oranges': 12}
于 2012-08-14T20:55:05.960 に答える
0
from collections import defaultdict
result = defaultdict(int)
lines = """
Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,12
"""
for k in lines.splitlines():
    result[k.split(",")[0]]+=int(k.split(",")[-1] or 0)#account for '' cases...
print result
于 2012-08-14T20:47:21.940 に答える
0
stuff = """
Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,2
"""

# Holds mapping from fruit->count    
total = {}

# Process input    
lines = stuff.strip().splitlines()

for x in lines:
    name, _, count = x.partition(",")
    total.setdefault(name, 0)
    total[name] += int(count)

# Output
for k, v in sorted(total.items()):
    print("{},{}".format(k, v))

(このマシンには Python 3 がインストールされていませんが、上記はおそらく微調整で動作するはずです)

于 2012-08-14T20:47:51.907 に答える
0

groupbyが好きではありませんか?

data = """\
Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,2""".splitlines()

from itertools import groupby

groups = groupby((line.split(',') for line in data), key=lambda x:x[0])
table = dict((k,sum(map(int,(x[1] for x in vals)))) for k,vals in groups)
for item in table.items():
    print '%s,%d' % item

版画:

Apples,7
Oranges,12
于 2012-08-15T13:31:34.583 に答える