Summarize a list of dictionaries based on common key values

后端 未结 3 977
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-01-28 01:15

I have a list of dictionaries like so:

dictlist = [{\'day\': 0, \'start\': \'8:00am\', \'end\': \'5:00pm\'},
            {\'day\': 1, \'start\': \'10:00am\', \'e         


        
3条回答
  •  情深已故
    2021-01-28 01:30

    If you don't need the exact format that you provide you could use defaultdict

    dictlist = [{'day': 0, 'start': '8:00am', 'end': '5:00pm'},
                {'day': 1, 'start': '10:00am', 'end': '7:00pm'},
                {'day': 2, 'start': '8:00am', 'end': '5:00pm'},
                {'day': 3, 'start': '10:00am', 'end': '7:00pm'},
                {'day': 4, 'start': '8:00am', 'end': '5:00pm'},
                {'day': 5, 'start': '11:00am', 'end': '1:00pm'}]
    
    from collections import defaultdict
    
    dd = defaultdict(list)
    
    for d in dictlist:
        dd[(d['start'],d['end'])].append(d['day'])
    

    Result:

    >>> dd
    defaultdict(, {('11:00am', '1:00pm'): [5], ('10:00am', '7:00pm'): [1, 3], ('8:00am', '5:00pm'): [0, 2, 4]})
    

    And if format is important to you could do:

    >>> my_list = [(v, k[0], k[1]) for k,v in dd.iteritems()]
    >>> my_list
    [([5], '11:00am', '1:00pm'), ([1, 3], '10:00am', '7:00pm'), ([0, 2, 4], '8:00am', '5:00pm')]
    >>> # If you need the output sorted:  
    >>> sorted_my_list = sorted(my_list, key = lambda k : len(k[0]), reverse=True)
    >>> sorted_my_list
    [([0, 2, 4], '8:00am', '5:00pm'), ([1, 3], '10:00am', '7:00pm'), ([5], '11:00am', '1:00pm')]
    

提交回复
热议问题