サンプル入力がある場合:
Apples,2
Apples,4
Apples,1
Oranges,10
Oranges,2
次のような出力を取得するにはどうすればよいですか。
Apples,7
Oranges,12
ありがとう。
編集:私はPython 3を使用しています
カウンターはこのために特別に設計されています。
# 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]))
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
ますが、この例ではやり過ぎに思えました。
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}
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
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 がインストールされていませんが、上記はおそらく微調整で動作するはずです)
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