这里有一个简单的选择:
import datetime
from collections import defaultdict
In [30]: with open("dates.txt") as f:
...: res = defaultdict(dict)
...: for line in f.readlines():
...: date, letter = line.rstrip().split(':')
...: letter = letter.replace("\"", "")
...: date = datetime.datetime.strptime(date, "'%Y-%m-%d'")
...: if letter in res[date]:
...: res[date][letter] += 1
...: else:
...: res[date][letter] = 1
In [31]: res
Out[31]:
defaultdict(dict,
{datetime.datetime(2014, 6, 9, 0, 0): {'b': 1},
datetime.datetime(2014, 8, 9, 0, 0): {'a': 2, 'b': 1},
datetime.datetime(2014, 9, 9, 0, 0): {'b': 1}})
假设你想要的键作为datetime对象。否则,您可以删除该部分。
还是在defaultdict使用计数器而不是字典:
In [36]: with open("dates.txt") as f:
...: res = defaultdict(Counter)
...: for line in f.readlines():
...: date, letter = line.rstrip().split(':')
...: letter = letter.replace("\"", "")
...: date = datetime.datetime.strptime(date, "'%Y-%m-%d'")
...: res[date].update({letter: 1})
...:
...:
In [37]: res
Out[37]:
defaultdict(collections.Counter,
{datetime.datetime(2014, 6, 9, 0, 0): Counter({'b': 1}),
datetime.datetime(2014, 8, 9, 0, 0): Counter({'a': 2, 'b': 1}),
datetime.datetime(2014, 9, 9, 0, 0): Counter({'b': 1})})
或由亚历山大所说,你可以使用lambda来创建复合默认字典。
In [38]: with open("dates.txt") as f:
...: res = defaultdict(lambda: defaultdict(int))
...: for line in f.readlines():
...: date, letter = line.rstrip().split(':')
...: letter = letter.replace("\"", "")
...: date = datetime.datetime.strptime(date, "'%Y-%m-%d'")
...: res[date][letter] += 1
In [39]: res
Out[39]:
defaultdict(<function __main__.<lambda>>,
{datetime.datetime(2014, 6, 9, 0, 0): defaultdict(int, {'b': 1}),
datetime.datetime(2014, 8, 9, 0, 0): defaultdict(int,
{'a': 2, 'b': 1}),
datetime.datetime(2014, 9, 9, 0, 0): defaultdict(int, {'b': 1})})
这工作,因为int()
等于0
,这是我以前从来没有意识到,但它非常有意义。信
按日期排序,然后量:
In [64]: l = list(res.items())
In [65]: l
Out[65]:
[(datetime.datetime(2014, 8, 9, 0, 0), defaultdict(int, {'a': 2, 'b': 1})),
(datetime.datetime(2014, 9, 9, 0, 0), defaultdict(int, {'b': 1})),
(datetime.datetime(2014, 6, 9, 0, 0), defaultdict(int, {'b': 1}))]
In [66]: l.sort(key=lambda x: (sum(x[1].values()), x[0]))
In [67]: l
Out[67]:
[(datetime.datetime(2014, 6, 9, 0, 0), defaultdict(int, {'b': 1})),
(datetime.datetime(2014, 9, 9, 0, 0), defaultdict(int, {'b': 1})),
(datetime.datetime(2014, 8, 9, 0, 0), defaultdict(int, {'a': 2, 'b': 1}))]
以何种方式根据需要不表现你的代码? –
根据样本数据,您的期望输出是多少? – Alexander
期望的输出是2014-08-09-> a:2,b:1 2014-09-09-> b:1 2014-06-09-> b:1,给出数据2014-08-09': “a”,2014-08-09':“a”,2014-08-09':“b”,, 2014-09-09':“b”,2014-06-09':“b”。 – shanky