0

という名前の関数に対して次の定義がありますintervals。下部の print ステートメントから、この結果が得られます (リスト内のリストとして表される 9:00、9:30 などの 30 分の時間間隔であると思います)。

[[9, 0], [10, 30], [10, 30], [10, 30]]

以下の結果を希望します。

[[9, 0], [ 9, 30], [10, 0], [10, 30]]

実行の完全なログは次のとおりです。リストはとステートメントの間のループでlist1 回だけ更新されますが、 の後で、次の の前に変更されることに注意してください。どうすればそれが起こりますか?whileprint "b(efore)"print "a(fter)"listafterbefore

[9, 30] [[9, 0]] b
[9, 30] [[9, 0], [9, 30]] a
[10, 0] [[9, 0], [10, 0]] b
[10, 0] [[9, 0], [10, 0], [10, 0]] a
[10, 30] [[9, 0], [10, 30], [10, 30]] b
[10, 30] [[9, 0], [10, 30], [10, 30], [10, 30]] a
[[9, 0], [10, 30], [10, 30], [10, 30]]

def intervals(start,end):
    if start>=end:
        return []
    else:
        if 0<=start[1]<30:
            start[1]=0
        else:
            start[1]=30
        list = []
        list.append(start)
        last = start
        new=[0,0]
        while end>last:
            if 30==last[1]:
                new[0]=1+last[0]
                new[1]=0
            else:
                new[0]=last[0]
                new[1]=30
            last=new
            print new,list,"b"
            list.append(new)
            print new,list,"a"
        return list

print intervals([9,0],[10,30])

誰でも修正できますか?

4

2 に答える 2

1

これが表示される理由は、whileループの各反復でリストnewをリストの最後に追加するためlistです (組み込みのリスト タイプをマスクするため、実際には名前を変更する必要があります)。

new=[0,0]ループの最初の行になるように行を移動するだけですwhile。これにより、反復ごとに新しいリストが作成されるため、最終的なリストに同じリストへの複数の参照が含まれなくなります。

        ...
        while end>last:
            new=[0,0]
            ...

これにさらに複雑さを追加する予定がある場合 (たとえば、30 分以外の間隔)、datetime モジュールを使用することをお勧めしますdatetime.timedelta(minutes=30)。たとえば、次のようにすると便利です。

from datetime import datetime, timedelta

def intervals(start, end):
    temp = datetime.min + timedelta(hours=start[0], minutes=start[1])
    last = datetime.min + timedelta(hours=end[0], minutes=end[1])
    interval = timedelta(minutes=30)
    result = []
    while temp <= last:
        result.append([temp.hour, temp.minute])
        temp += interval
    return result

>>> intervals([9, 30], [12, 30])
[[9, 30], [10, 0], [10, 30], [11, 0], [11, 30], [12, 0], [12, 30]]
>>> intervals([9, 45], [12, 15])
[[9, 45], [10, 15], [10, 45], [11, 15], [11, 45], [12, 15]]
于 2012-08-27T19:05:06.833 に答える
0

while-elseループを使用:

start_hour=9
start_min=30
lis=[[start_hour,start_min]] #simple initialize
stop_hour=12
stop_min=30

while lis[-1][0]!=stop_hour:
    if lis[-1][1]==30:
        lis.append([lis[-1][0]+1,0])
    else:
        lis.append([lis[-1][0],30])
else:
    if lis[-1][1]!=stop_min:
        lis.append([lis[-1][0],stop_min])


print lis        

出力:

[[9, 30], [10, 0], [10, 30], [11, 0], [11, 30], [12, 0], [12, 30]]
于 2012-08-27T19:07:30.777 に答える