2

次のような時間の入力があります。

09:00 12:00
10:00 13:00
11:00 12:30
12:02 15:00
09:00 10:30

分に変換されたタプルのリストにそれを構築しようとしています:

[(540, 720), (600, 780), (660, 750), (722, 900), (540, 630)]

変換を行うための、よりクリーンでより Pythonic な方法が必要です。私は現在、これを行う不器用な方法を持っています:

def readline(): 
    return sys.stdin.readline().strip().split()

natimes = [tuple(readline()) for _ in xrange(linesofinput))]
for i, (a,b) in enumerate(natimes):
    c = int(a.split(':')[0])* 60 + int(a.split(':')[1])
    d = int(b.split(':')[0])* 60 + int(b.split(':')[1])
    natimes[i] = (c,d)

ここでPythonを適切に使用しているとは思えません。

4

4 に答える 4

5

使用機能:

def time_to_int(time):
    mins,secs = time.split(':')
    return int(mins)*60 + int(secs)

def line_to_tuple(line):
    return tuple(time_to_int(t) for t in line.split())

natimes = [line_to_tuple(line) for line in sys.stdin]
于 2013-02-28T19:01:27.017 に答える
2

のような高価な操作の重複は避けてくださいstr.split。以下は簡単な答えです:

>>> print(s)
09:00 12:00
10:00 13:00
11:00 12:30
12:02 15:00
09:00 10:30
>>> def to_minutes(s):
...     hour, min = map(int, s.split(":"))
...     return hour * 60 + min
... 
>>> to_minutes("12:30")
750
>>> res = []
>>> for i1, i2 in map(str.split, s.split("\n")):
...     res.append((to_minutes(i1), to_minutes(i2)))
... 
>>> res
[(540, 720), (600, 780), (660, 750), (722, 900), (540, 630)]
于 2013-02-28T19:02:32.290 に答える
1

正規表現を使用した別のオプションを次に示します。

import re
regex = re.compile('\s*(\d\d):(\d\d)\s+(\d\d):(\d\d)\s*')
natimes = []

for line in sys.stdin.readline():
    m = regex.match(line)
    if m:
        natimes.append((int(m.group(1))*60 + int(m.group(2)),
                        int(m.group(3))*60 + int(m.group(4))))
于 2013-02-28T19:13:02.390 に答える
0

これを行う方法は次のとおりです(ただし、この例では代わりにデータ文字列を使用しています):

data = """09:00 12:00
10:00 13:00
11:00 12:30
12:02 15:00
09:00 10:30
"""

def minutes(s):
    hr, min = s.split(":")
    return int(hr) * 60 + int(min)

rv = []
for line in data.splitlines(): # may also use readlines from a file object
    rv.append(tuple([minutes(s) for s in line.split()]))

rv
# OUT: [(540, 720), (600, 780), (660, 750), (722, 900), (540, 630)]
于 2013-02-28T19:07:17.623 に答える