2

私はPythonにかなり慣れていません(数週間)、データ構造に頭を悩ませています。私がこれまでに行ったことは、.txt ファイルからテキストを 1 行ずつ抽出し、たとえばキーを animal として辞書に保存することです。

database = {
    'dog': ['apple', 'dog', '2012-06-12-08-12-59'],
    'cat': [
        ['orange', 'cat', '2012-06-11-18-33-12'],
        ['blue', 'cat', '2012-06-13-03-23-48']
    ],
    'frog': ['kiwi', 'frog', '2012-06-12-17-12-44'],
    'cow': [
        ['pear', 'ant', '2012-06-12-14-02-30'],
        ['plum', 'cow', '2012-06-12-23-27-14']
    ]
} 

# year-month-day-hour-min-sec                                       

そうすれば、辞書を印刷するときに、動物の種類ごとに最新の日付が最初に印刷されます。

このデータを時間でソートする最良の方法は何ですか? 私はpython 2.7を使用しています。私が考えているのは

各キーについて:

リスト (またはリストのリスト) を取得します --> 3 番目のエントリを取得します -->'-'.splitそれ、 --> 次に、sorted(parameters)

これについてどうすればいいのか本当にわかりません...

4

3 に答える 3

4

辞書の要素を順に見ていきます。値ごとsortedに、リストのリストで実行し、並べ替えアルゴリズムにリストの 3 番目のフィールドを「キー」要素として使用するように指示します。この重要な要素は、ソート順を確認するために値をリスト内の他の要素と比較するために使用されます。sortedリストのどの要素でソートするかを指定するには、 を使用しoperator.itemgetterて 3 番目の要素を指定します。

タイムスタンプは厳密に構造化されており、タイムスタンプの各文字は次の文字よりも時間的に重要であるため、文字列のように自然に並べ替えることができます。時刻に変換する必要はありません。

# Dictionary stored in d
from operator import itemgetter
# Iterate over the elements of the dictionary; below, by
# calling items(), k gets the key value of an entry and 
# v gets the value of that entry
for k,v in d.items():
    if v and isinstance(v[0], list):
        v.sort(key=itemgetter(2)) # Start with 0, so third element is 2
于 2012-06-20T00:03:54.950 に答える
3

日付がすべて , の形式year-month-day-hour-min-secである場合2012-06-12-23-27-14、分割の手順は必要ないと思います。それらを文字列として比較するだけです。

>>> '2012-06-12-23-27-14' > '2012-06-12-14-02-30'                              
True 
于 2012-06-20T00:05:03.740 に答える
1

まず、辞書内の各キー、値項目を同様のタイプにする必要があります。現時点では、それらの一部 (例: database['dog'] ) は文字列 (行) のリストであり、一部 (例: database['cat']) は行のリストです。それらをすべて行のリスト形式にすると (行のリストに項目が 1 つしかない場合でも)、はるかに簡単になります。

次に、(古い) 方法の 1 つは、それらの行の比較関数を作成することです。日付はすでに直接 (文字列) 比較可能な形式になっているため、これは簡単です。2 つの行を比較するには、それらの 3 番目 (2 番目のインデックス) の項目を比較します。

def compare_line_by_date(x,y):
    return cmp(x[2],y[2])

sorted最後に、ビルトインに compare_line_by_date 関数を使用するように指示することで、特定のキーの行を並べ替えることができます。

sorted(database['cat'],compare_line_by_date)

上記は、任意の複雑な比較/ソート関数に適しています (ただし、遅く、python 3 では消えます)。たとえば、keysorted のパラメーターを使用して、特定の並べ替えを行う方法は他にもあります。

def key_for_line(line):
    return line[2]

sorted(database['cat'],key=key_for_line)

並べ替えにキーを使用すると、リスト内のアイテムが比較されるたびに (通常はアイテムの数よりもはるかに頻繁に) キー関数を実行する必要があるのではなく、並べ替えるリスト内のアイテムごとに 1 回だけ実行する必要があるため、cmp よりもはるかに高速です。リストにあります)。キーの考え方は、基本的に各リスト項目を、文字列や数値など、自然に比較できるものに煮詰めることです。上記の例では、行を日付だけに煮詰めて比較しています。

免責事項: この回答のコードはテストしていませんが、動作するはずです!

于 2012-06-20T00:15:32.560 に答える