-1

txtファイルから時間の合計を返す方法は?

txt コンテンツ:

Willy,10,37,40,20,30
Georgy,30,30,29.5,5
Addi, 20,20,20
Lisy,16,16,20

ライブラリをインポートせずにそのような結果を作成できますか? 結果:

Willy:137
Georgy:94.5
Addi:60
Lisy:52

アップデート

名前で時間を合計できるようにしたいと思います。つまり、次のデータが与えられた場合 ( が 2 回出現することに注意してくださいWilly。上記と同じ結果が得られるはずです。

Willy,10,37,20
Georgy,30,30,29.5,5
Addi, 20,20,20
Lisy,16,16,20
Willy,40,30
4

5 に答える 5

3

このようなもの:

>>> with open("data2.txt") as f: 
...     for line in f:           #traverse over each line
...         spl=line.split(",")  #split the line at ","
                             #so now spl[0] is the name and spl[1:] are the hours 
...         print "{0}:{1}".format(spl[0],sum(map(float,spl[1:])))

         #sum(map(float,spl[1:])) returns the sum of hours after converting them to floats

出力:

Willy:137.0
Georgy:94.5
Addi:60.0
Lisy:52.0

編集:更新された質問の場合:使用OrderedDict()

from collections import OrderedDict as od
with open("data2.txt") as f:
    dic=od()
    for line in f:
        spl=line.split(",")
        name,summ=spl[0],sum(float(x) for x in spl[1:])
        dic.setdefault(spl[0],[]).append(summ)
    for x,y in dic.items():
        print"{0}:{1}".format(x,sum(y))

出力:

Willy:137.0
Georgy:94.5
Addi:60.0
Lisy:52.0
于 2012-10-29T16:09:32.493 に答える
2

行ごとの合計

派手なインポートやmap. とリスト内包表記
だけsplitです。float

with open('data.txt') as f:
    for l in f:
        name,hours = l.split(',',1)
        print '%s:%s' % (name, sum([float(x) for x in hours.split(',')]))

更新された質問のデータを出力します。

Willy:67.0
Georgy:94.5
Addi:60.0
Lisy:52.0
Willy:70.0

1人あたりの金額

それが探しているものではない場合 (同じ名前の複数の行を合計したい場合)、次の辞書ベースのアプローチを試すことができます。

with open('data.txt') as f:
    d = {}
    for l in f:
        name,hours = l.split(',',1)
        if name in d:
            d[name] = d[name] +  int(sum([float(x) for x in hours.split(',')]))
        else:
            d[name] = int(sum([float(x) for x in hours.split(',')]))
for n in d:
    print '%s:%s' % (n, d[n])

ご覧のとおり、これは Willy の 2 つの行を結合します。

Willy:137.0
Georgy:94.5
Addi:60.0
Lisy:52.0
于 2012-10-29T16:19:26.013 に答える
0

これが私の解決策です:

import csv

with open('input.txt', 'rb') as f:
    for line in csv.reader(f):
        print ':'.join((line[0], str(sum([float(e) for e in line[1:]]))))
于 2012-10-29T16:09:23.767 に答える
0

その出力に設定されている場合は、 and を次のように使用str.splitsumますast.literal_eval

import ast
with open('txt') as f:
    for line in f:
        name,data = line.split(',',1)
        print '{0}:{1}'.format(name,sum(ast.literal_eval(data)))

ここでは、最初のコンマで文字列を 2 つの文字列に分割ast.literal_evalし、右側の文字列を数値のタプルに変換するために使用します。あなたもできる

sum(float(x) for x in data.split(','))

それ以外の:

sum(ast.literal_eval(data))

ただし、これにより常に浮動小数点の結果が得られます (すべての入力数値が整数であっても) ast.literal_eval

于 2012-10-29T16:06:57.807 に答える
0

defaultdict を使用して特定の名前のすべての時間を累積し、それを繰り返し処理して合計時間数を表示する例。(もちろん、リストを作成せずに外出先で合計することもできますが、正確な時間を知っていると後で役立つ場合がありますか?)

import csv
from collections import defaultdict

name_hours = defaultdict(list)

with open('somefile') as fin:
    for row in csv.reader(fin):
        name, hours = row[0], row[1:]
        row[name].extend(map(int, hours))

print name_hours

for name, hours in name_hours.iteritems():
    print name, sum(hours)
于 2012-10-29T16:50:25.787 に答える