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(<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

3 回答 3

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()}
于 2013-05-21T16:58:37.403 回答
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()})
于 2013-05-21T17:06:35.163 回答
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')]
}
于 2013-05-21T17:09:19.923 回答