2017-01-28 14 views
0

私は以下の辞書のリストを持っています。私は開始時間と終了時間に基づいてアウトを出したいと思っていました。 2つ以上の日が同じタイミングである場合は、出力に示すように組み合わせて表示する必要があります。与えられたPython辞書の辞書の要素をどのように一致させるか?

timings = [ 
    {'day': 'Monday', 'start': '8:00 am', 'close': '5:00 pm'}, 
    {'day': 'Tuesday', 'start': '7:00 am', 'close': '4:00 pm'}, 
    {'day': 'Wednesday', 'start': '7:00 am', 'close': '4:00 pm'}, 
    {'day': 'Thursday', 'start': '8:00 am', 'close': '5:00 pm'}, 
    {'day': 'Friday', 'start': '9:00 am', 'close': '4:00 pm'}, 
    {'day': 'Saturday', 'start': '9:00 am', 'close': '4:00 pm'}, 
    {'day': 'Sunday', 'start': '8:00 am', 'close': '5:00 pm'} 
] 

出力:

Monday   - 8:00 am - 5:00 pm 

Tuesday-Wednesday - 7:00 am - 4:00 pm 

Thursday   - 8:00 am - 5:00 pm 

Friday-Saturday - 9:00 am - 4:00 pm 

Sunday   - 8:00 am - 5:00 pm 
+0

おそらくあなたはdatetimeオブジェクトを使用する場合は非常に簡単です。 –

+0

@AChampion yea、確かに、あなたはまだ文字列として時間を持っています。 –

+0

@ juanpa.arrivillaga私は問題として文字列の比較ではこの問題を解決するのに十分であることを知っています。 '' 9:00 am '==' 9:00 am ' - > True' – AChampion

答えて

4

この問題の簡単な解決策は、itertools.groupbyを使用することです、例えば:これは...文字列を使用してうるさく困難になるだろう

>>> import itertools as it 
>>> for (start, close), days in it.groupby(timings, lambda t: (t['start'], t['close'])): 
... print('{:20} - {} - {}'.format('-'.join(d['day'] for d in days), start, close)) 
Monday    - 8:00 am - 5:00 pm 
Tuesday-Wednesday - 7:00 am - 4:00 pm 
Thursday    - 8:00 am - 5:00 pm 
Friday-Saturday  - 9:00 am - 4:00 pm 
Sunday    - 8:00 am - 5:00 pm 
+0

非常に良い! - 日時が正しく「タイミング」で順序付けされ、 'groupby'が既にキーによってソートされたリストを期待するという事実を利用することができるかどうか分からなかった。後者の事実の(短い)説明を追加すると役に立つでしょうか? –

+0

ありがとうございました。私は文字列の比較とすべてを使用してみました。大規模なコードで終わった。 @ジョナサン説明をありがとう。 –

関連する問題