2

我对 python 还是很陌生(几周后),我在理解数据结构时遇到了一些麻烦。到目前为止,我所做的是从 .txt 文件中逐行提取文本,并将它们存储到字典中,例如,键为动物。

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 上。我在想的是

对于每个键:

获取列表(或列表列表)-> 获取第三个条目-->'-'.split它,--> 然后也许尝试sorted(parameters)

我只是不确定该怎么做...

4

3 回答 3

4

浏览字典的元素。对于每个值,sorted在列表列表上运行,并告诉排序算法使用列表的第三个字段作为“键”元素。此关键元素用于将值与列表中的其他元素进行比较以确定排序顺序。要告诉sorted列表中的哪个元素进行排序,请使用operator.itemgetter指定第三个元素。

由于您的时间戳具有严格的结构,并且时间戳中的每个字符都比下一个字符在时间上更重要,因此您可以像字符串一样自然地对它们进行排序 - 您不需要将它们转换为时间。

# 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-sec2012-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

首先,您可能希望 dict 中的每个键、值项具有相似的类型。目前,其中一些(例如:database['dog'])是字符串列表(一行),而一些(例如:database['cat'])是行列表。如果您将它们全部放入行列表格式中(即使行列表中只有一项),它会容易得多。

然后,一种(旧)方法是为这些行创建一个比较函数。这很容易,因为您的日期已经采用直接(字符串)可比较的格式。要比较两行,您需要比较其中的第三个(第二个索引)项:

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)

The above is suitable (but slow, and will disappear in python 3) for arbitrarily complex comparison/sorting functions. There are other ways to do your particular sort, for example by using the key parameter of sorted:

def key_for_line(line):
    return line[2]

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

Using keys for sorting is much faster than cmp because the key function only needs to be run once per item in the list to be sorted, instead of every time items in the list are compared (which is usually much more often than the number of items in the list). The idea of a key is to basically boil each list item down into something that be compared naturally, like a string or a number. In the example above we boiled the line down into just the date, which is then compared.

Disclaimer: I haven't tested any of the code in this answer... but it should work!

于 2012-06-20T00:15:32.560 回答