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(<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))
答案 0 :(得分: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()}
答案 1 :(得分: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()})
答案 2 :(得分: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')]
}