我是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)
我只是不确定如何解决这个问题......
答案 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-sec
,2012-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快得多,因为关键函数只需要在要排序的列表中的每个项目运行一次,而不是每次比较列表中的项目(这通常比列表中的项目数)。关键的想法是将每个列表项基本上煮成自然比较的东西,比如字符串或数字。在上面的示例中,我们将该行简化为日期,然后进行比较。
免责声明:我没有测试过这个答案中的任何代码......但是它应该有效!