根据时间对字典列表值进行排序

时间:2012-06-19 23:50:55

标签: python list sorting date dictionary

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

每个键

获取列表(或列表列表) - >得到第3个条目 - > '-'.split它, - >然后可以尝试sorted(parameters)

我只是不确定如何解决这个问题......

3 个答案:

答案 0 :(得分:4)

浏览字典中的元素。对于每个值,在列表列表上运行sorted,并告诉排序算法使用列表的第三个字段作为“key”元素。此关键元素用于将值与列表中的其他元素进行比较,以确定排序顺序。要告诉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

答案 1 :(得分: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 

答案 2 :(得分: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)

对于任意复杂的比较/排序函数,上述内容是合适的(但很慢,并且将在python 3中消失)。还有其他方法可以进行特定排序,例如使用sorted {/ p>的key参数

def key_for_line(line):
    return line[2]

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

使用键进行排序要比cmp快得多,因为关键函数只需要在要排序的列表中的每个项目运行一次,而不是每次比较列表中的项目(这通常比列表中的项目数)。关键的想法是将每个列表项基本上煮成自然比较的东西,比如字符串或数字。在上面的示例中,我们将该行简化为日期,然后进行比较。

免责声明:我没有测试过这个答案中的任何代码......但是它应该有效!