4

午前 8:00 から午後 7:00 頃までの時間のリストを文字列形式で持っています。午前/午後は指定されておらず、24 時間時計の使用はオプションではありません。このリストを時間で並べ替えたいのですが、実際には時間的には 8 ~ 12 がそれより前であるにもかかわらず、数値の並べ替えは 1 から始まるため、時計が 1 を打った後に問題が発生します。タプルの新しいリストを作成して、時間をより適切な数値に変換する関数を実行し、それを並べ替え、それを必要とする関数でタプルの最初の要素を使用できると考えていました。これは機能するように見えますが、もっとエレガントで基本的なものを見落としているのではないかと心配しています。私ですか?

4

2 に答える 2

5

keyパラメータ tolist.sort()または関数を使用してsorted()、ソートする値を指定します。

values.sort(key=somefunction)

wheresomefunctionは 1 つの引数 (変換される値) を取ります。

リストはパラメータの戻り値に基づいてソートされkeyますが、元の値自体はそのまま残ります。

問題に対して、次を使用できます。

def daytime(val):
    hour, min = map(int, val.split(':'))
    if hour < 8:
        hour += 12
    return hour, min

これはおよびに変換8:01され、またはの前にソートされます:(8, 1)6:25(18, 25).sort()sorted()8:016:25

>>> sorted(['1:14', '8:01', '12:46', '6:25'], key=daytime)
['8:01', '12:46', '1:14', '6:25']

詳細とヒントについては、Python Sorting HOWTOを参照してください (最近のセキュリティ エクスプロイトから回復するまで、このGoogle キャッシュ リンクを使用してください)。wiki.python.org

于 2013-01-15T12:34:59.210 に答える
4

この関数to_minutesは、文字列を整数の時間と分に変換し、8:00からの分数を計算して、8:00より前の時間に12時間を追加します。次に、この分数に従って並べ替えます。

def to_minutes(s):
    h,m = map(int, s.split(':'))
    return ((h - 8) % 12) * 60 + m

a = ['1:45', '8:00', '6:15', '12:30']
print sorted(a, key=to_minutes)

プリント

['8:00', '12:30', '1:45', '6:15']
于 2013-01-15T12:37:34.300 に答える