2013-05-21 45 views
0
defaultdict(<type 'list'>, {'003': [('Biology', 'A', '04/18/2013'), ('Irdu', 'A' 
, '04/17/2013')], '002': [('Biology', 'A', '03/01/2013'), ('Math', 'C', '01/10/2 
013'), ('Math', 'C', '03/10/2013')], '001': [('Biology', 'B', '05/01/2013'), ('L 
iterature', 'B', '03/02/2013'), ('Math', 'A', '02/20/2013')]}) 

我想按日期排序每个键,得到下面的输出如何按日期排序defaultdict(list)值?

defaultdict(<type 'list'>, {'003': [('Irdu', 'A', '04/17/2013'), ('Biology', 'A', '04/18/2013')], '002': [('Math', 'C', '01/10/2013'), ('Biology', 'A', '03/01/2013'), ('Math', 'C', '03/10/2013')], '001': [('Math', 'A', '02/20/2013'), ('Literature', 'B', '03/02/2013'), ('Biology', 'B', '05/01/2013')]}) 

我尝试以下,但没有工作任何想法?

accounts = defaultdict(list) 
sortedData = sorted(accounts.iteritems(), key=operator.itemgetter(2)) 
+4

您显示的示例输出不是原始的排序版本,而是进行了变异;元组还没有被排序,你实际上只是改变了它们的日期。 – voithos

+0

编辑输出 – Think

回答

2

我想你想要的东西,如:

key = itemgetter(2) 
sortedData = {} 
for k, v in accounts.items(): 
    v.sort(key=key) 
    sortedData[k] = v 

sortedData = {(k, list(sorted(v, key=key)) for k, v in accounts.items()} 
+0

酷。谢谢。我最终使用这个解决方案。 – Think

+0

嗯@dugres我认为按日期排序工作得很好。但看起来不是。任何想法 ? defaultdict(,{ '11163722404385':[( '#3', '生物学', 'A', '星期一4月22日13点32分00秒PDT 2013'),( '#3', '2089', 'Irdu','B','Wed Apr 10 15:31:00 PDT 2013')],'1116372240485':[('#3','2089','Biology','C','Mon Apr 25 13:32:00 PDT 2013'),('#3','2089','Math','A','Mon Apr 22 13:31:14 PDT 2013'),('#3','2089 ','Literature','C','Mon Apr 22 13:31:00 PDT 2013')]}) getter = operator.itemgetter(3) for accounts.itervalues(): v.sort (key = getter) – Think

1

iteritems返回键/值对的迭代器。如果你想使用它,你将不得不跳过键并对值进行排序。如果你想真正修改defaultdict本身,就地排序将是最好的:

getter = operator.itemgetter(2) 
for v in accounts.itervalues(): 
    v.sort(key=getter) 

如果你想要一个新的defaultdict,您可以用生成器表达式:

getter = operator.itemgetter(2) 
sortedData = defaultdict(list, 
    {k: sorted(v, key=getter) for k, v in accounts.iteritems()}) 
+0

谢谢。所有答案都是正确的。我结束了使用@dugres。 – Think

1

这应该做技巧:

from collections import defaultdict 
from datetime import datetime 

d = defaultdict(list, {'003': [('Biology', 'A', '04/18/2013'), ('Irdu', 'A', '04/17/2013')], '002': [('Biology', 'A', '03/01/2013'), ('Math', 'C', '01/10/2013'), ('Math', 'C', '03/10/2013')], '001': [('Biology', 'B', '05/01/2013'), ('Literature', 'B', '03/02/2013'), ('Math', 'A', '02/20/2013')]}) 

def key(entry): 
    _, _, date_string = entry 
    date_entry = datetime.strptime(date_string, '%m/%d/%Y').date() 
    return (date_entry.year, date_entry.month, date_entry.day) 

{k: sorted(v, key=key) for k,v in d.iteritems()} 
>>> { 
'001': [('Math', 'A', '02/20/2013'), 
    ('Literature', 'B', '03/02/2013'), 
    ('Biology', 'B', '05/01/2013')], 
'002': [('Math', 'C', '01/10/2013'), 
    ('Biology', 'A', '03/01/2013'), 
    ('Math', 'C', '03/10/2013')], 
'003': [('Irdu', 'A', '04/17/2013'), ('Biology', 'A', '04/18/2013')] 
} 
+0

谢谢。所有答案都是正确的。我结束了使用@dugres。 – Think