2017-08-05 10 views
0

'datetime'オブジェクトのリストをソートしてインデックスを返したいと思います。 [(2012, 6, 1, 0, 0),(2010, 1, 1, 0, 0)]をソートし、[2,1]を返します。Pythonで日時をソートしてインデックスエラーを返します

私は、次の使用のpythonコード:

>>>date_seq = [datetime.datetime(1993, 3, 25, 0, 0), 
    datetime.datetime(1985, 6, 18, 0, 0), 
    datetime.datetime(1971, 7, 8, 0, 0)] 

>>>sorted(date_seq, key=lambda k:date_seq[k]) 

しかし、エラーメッセージが表示されました:

私の質問は
  1. コード "がソートないのはなぜ

    (date_seqある
    TypeError: list indices must be integers or slices, not datetime.datetime 
    

    'の作品'ソート(date_seq、key = lambda:date_seq [k])'?

  2. この場合、ソートされたインデックスを取得するにはどうすればよいですか?

答えて

0

この場合、keyは使用しないでください。これは、など、それらの値

key=lambda k:date_seq[k] 

kに基づいてネストされたリスト、またはその属性のいずれかに基づいて、オブジェクト、dictsをソートするために、ここでは基本的datetimeオブジェクトされますので、sorteddate_seqを反復処理し、その中に各アイテムであなたのラムダを実行あなたのラムダの出力は "comparable"でなければなりません。例えば><==などを使用することができます。つまり、__lt____eq__が定義されています。もちろん出力は同等でなければなりませんその間に例外が発生する)

あなたの2番目の質問について

[datetime.datetime(1993, 3, 25, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1971, 7, 8, 0, 0)] 

EDITは、私は見ませんでした:

sorted(date_seq, key=lambda x: x.month) 

については

月昇順(コースの年と日を無視)のあなたの日付をソートしますsortedmap(またはリストの解説)ではありません。リスト内の項目を変更することはできません。ソートするだけです。 mapまたはリスト内包を使用し、list.indexの機能を使用します。私が間違っていた理由は、私が見

[sorted(date_seq).index(x) + 1 for x in date_seq] 
# outputs [3, 2, 1] for your sample array 

Here is documentation for sorted (python 3.6).

+0

。ソートされたリストではなく、インデックスを返すというアイデアはありますか? –

+0

私の編集は、あなたがしたいことを正確に行うようです。ソートされたリストを取得し、ソートされていないリストの各項目のソートされたリストでインデックスを取得します。 – Unatiel

0

リストをソートしようとすると、リストインデックスとしてintegerを使用する必要があります。あなたはdatetime.datetimeタイプのkを使用してください。したがって、このエラーが発生しています:

>>> import datetime 
>>> date_seq = [datetime.datetime(1993, 3, 25, 0, 0), 
... datetime.datetime(1985, 6, 18, 0, 0), 
... datetime.datetime(1971, 7, 8, 0, 0)] 
>>> sorted(date_seq, key=lambda k:date_seq[0]) 
[datetime.datetime(1993, 3, 25, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1971, 7, 8, 0, 0)] 
>>> sorted(date_seq, key=lambda k:k.year) # sort according to `year` 
[datetime.datetime(1971, 7, 8, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1993, 3, 25, 0, 0)] 
>>> sorted(date_seq, key=lambda k:k.month) # sort according to `month` 
[datetime.datetime(1993, 3, 25, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1971, 7, 8, 0, 0)] 
>>> sorted(date_seq, key=lambda k:k.day) # # sort according to `day` 
[datetime.datetime(1971, 7, 8, 0, 0), datetime.datetime(1985, 6, 18, 0, 0), datetime.datetime(1993, 3, 25, 0, 0)] 
>>> 
関連する問題