【问题标题】:Ordering the Counter keys by month按月订购 Counter 键
【发布时间】:2018-03-04 17:03:38
【问题描述】:

所以我有一个看起来像这样的答案:

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 个,但这里有几个示例)并返回该月出现的次数:

year,month,age,sex
2013,JUN,20,M
2011,MAR,29,F
2011,JUL,26,M
2011,APR,20,M

我当前的代码看起来像这样(我现在只是看看 year10 的回报)

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)

上下文问题:

您可以假设文件格式正确(即,如上例所示,以标题行开头)。 您可以假设每条记录的格式都正确,但您的函数应该只计算有效记录。有效记录是具有有效年份和月份值的记录。 有效年份为:2010、2011、2012、2013、2014 有效月份为:1 月、2 月、3 月、4 月、5 月、6 月、7 月、8 月、9 月、10 月、11 月、12 月 应忽略无效记录

【问题讨论】:

  • 柜台里的物品是无序的。您必须手动对其进行排序。

标签: python list function counter


【解决方案1】:

不幸的是,Counter 对象无法维持秩序。但是,OrderedDicts 。您可以使用生成器推导将 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)])

【讨论】:

  • 天哪,我不知道这是一件事!谢谢!!!有没有一种方法可以手动强制并添加 0 的值,即如果月份不计算在内,则附加字典,因为如果没有,计数器将忽略它
  • @AkiraWang 实际上,我在计数为 0 的 ignore 个月中添加了一个条件,但是默认情况下包含它们。查看我的编辑。
  • 哦,是的,我现在看到了!非常感谢:)
  • @AkiraWang 如果你能accept my answer,我会很高兴。谢谢。
  • 没关系,这在这里有意义,但是当我尝试实现它时,我才意识到它可以工作,因为 Counter 返回一个字典、键列表,而我的实际代码是列表格式。所以目前一个缩短的示例列表 year10 = ['JUN', 'FEB', 'MAR', 'MAY'], 有没有办法返回 [0, 1, 1, 0, 1, 1, 0, 0, 0 , 0 ,0 ,0] 它在哪里以月为单位?很抱歉!
猜你喜欢
  • 2023-01-23
  • 1970-01-01
  • 2014-02-14
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
相关资源
最近更新 更多