按月订购计数器键
Ordering the Counter keys by month
所以我的答案看起来像:
Counter({'APR': 76, 'MAR': 67, 'MAY': 51, 'JUN': 28, 'FEB': 17, 'JAN': 4, 'JUL': 3, 'DEC': 1, 'AUG': 1})
但希望按月顺序排列,包括计数为 0 的月份:
Counter({'JAN': 4, 'FEB': 17, 'MAR': 67, 'APR': 76, 'MAY': 51, 'JUN': 28, 'JUL': 3, 'AUG': 1, 'SEP': 0, 'OCT': 0, 'NOV': 0, 'DEC': 1})
我的项目导入一个 .csv 文件,其中包含值列表(大约有 1400 个,但这里有一些示例)和 returns 这个月出现的次数:
year,month,age,sex
2013,JUN,20,M
2011,MAR,29,F
2011,JUL,26,M
2011,APR,20,M
我当前的代码如下所示(我现在只看到 year10 returns)
def parse_data(filename):
with open('case_list.csv', 'r') as f:
temp_read = csv.reader(f)
month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
year = ['2010', '2011', '2012', '2013', '2014']
read, year10, year11, year12, year13, year14 = [], [], [], [], [], []
for i in temp_read:
if i[0] in year and i[1] in month:
read.append(i[0:2])
for j in read:
if j[0].startswith('2010'):
year10.append(j[1])
if j[0].startswith('2011'):
year11.append(j[1])
if j[0].startswith('2012'):
year12.append(j[1])
if j[0].startswith('2013'):
year13.append(j[1])
if j[0].startswith('2014'):
year14.append(j[1])
return Counter(year10)
上下文问题:
您可以假定文件格式正确(即,如上例所示,以 header 行开头)。
您可以假设每条记录的格式都正确,但您的函数应该只对有效记录进行计数。有效记录是具有有效年份和月份值的记录。
有效年份为:2010、2011、2012、2013、2014
有效月份为:JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC
应忽略无效记录
不幸的是,Counter
对象不保持秩序。然而,OrderedDict
s do。您可以使用生成器理解将 Counter
转换为 OrderedDict
并将其传递给构造函数。
month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
o = OrderedDict((m, c[m]) for m in month if c[m] > 0)
print(o)
OrderedDict([('JAN', 4),
('FEB', 17),
('MAR', 67),
('APR', 76),
('MAY', 51),
('JUN', 28),
('JUL', 3),
('AUG', 1),
('DEC', 1)])
我添加了一个条件来忽略计数为 0
的月份。如果你想要那些,你的代码通过使用 map
:
来简化
o = OrderedDict(map(lambda m: (m, c[m]), month))
print(o)
OrderedDict([('JAN', 4),
('FEB', 17),
('MAR', 67),
('APR', 76),
('MAY', 51),
('JUN', 28),
('JUL', 3),
('AUG', 1),
('SEP', 0),
('OCT', 0),
('NOV', 0),
('DEC', 1)])
所以我的答案看起来像:
Counter({'APR': 76, 'MAR': 67, 'MAY': 51, 'JUN': 28, 'FEB': 17, 'JAN': 4, 'JUL': 3, 'DEC': 1, 'AUG': 1})
但希望按月顺序排列,包括计数为 0 的月份:
Counter({'JAN': 4, 'FEB': 17, 'MAR': 67, 'APR': 76, 'MAY': 51, 'JUN': 28, 'JUL': 3, 'AUG': 1, 'SEP': 0, 'OCT': 0, 'NOV': 0, 'DEC': 1})
我的项目导入一个 .csv 文件,其中包含值列表(大约有 1400 个,但这里有一些示例)和 returns 这个月出现的次数:
year,month,age,sex
2013,JUN,20,M
2011,MAR,29,F
2011,JUL,26,M
2011,APR,20,M
我当前的代码如下所示(我现在只看到 year10 returns)
def parse_data(filename):
with open('case_list.csv', 'r') as f:
temp_read = csv.reader(f)
month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
year = ['2010', '2011', '2012', '2013', '2014']
read, year10, year11, year12, year13, year14 = [], [], [], [], [], []
for i in temp_read:
if i[0] in year and i[1] in month:
read.append(i[0:2])
for j in read:
if j[0].startswith('2010'):
year10.append(j[1])
if j[0].startswith('2011'):
year11.append(j[1])
if j[0].startswith('2012'):
year12.append(j[1])
if j[0].startswith('2013'):
year13.append(j[1])
if j[0].startswith('2014'):
year14.append(j[1])
return Counter(year10)
上下文问题:
您可以假定文件格式正确(即,如上例所示,以 header 行开头)。 您可以假设每条记录的格式都正确,但您的函数应该只对有效记录进行计数。有效记录是具有有效年份和月份值的记录。 有效年份为:2010、2011、2012、2013、2014 有效月份为:JAN、FEB、MAR、APR、MAY、JUN、JUL、AUG、SEP、OCT、NOV、DEC 应忽略无效记录
不幸的是,Counter
对象不保持秩序。然而,OrderedDict
s do。您可以使用生成器理解将 Counter
转换为 OrderedDict
并将其传递给构造函数。
month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN',
'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
o = OrderedDict((m, c[m]) for m in month if c[m] > 0)
print(o)
OrderedDict([('JAN', 4),
('FEB', 17),
('MAR', 67),
('APR', 76),
('MAY', 51),
('JUN', 28),
('JUL', 3),
('AUG', 1),
('DEC', 1)])
我添加了一个条件来忽略计数为 0
的月份。如果你想要那些,你的代码通过使用 map
:
o = OrderedDict(map(lambda m: (m, c[m]), month))
print(o)
OrderedDict([('JAN', 4),
('FEB', 17),
('MAR', 67),
('APR', 76),
('MAY', 51),
('JUN', 28),
('JUL', 3),
('AUG', 1),
('SEP', 0),
('OCT', 0),
('NOV', 0),
('DEC', 1)])