Boky
Boky

Reputation: 12054

How to sort and group an list of dictionaries in right way in Python

I have an list of dict in Python as follows:

options = [
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Air conditioning'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Air suspension'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Cruise control'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Leather interior'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Parking assist system camera'},
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Parking assist system sensors rear'},
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Power steering'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Seat heating'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Sunroof'}, 
  {'group_priority': 3, 'group': u'Entertainment', 'name': u'Bluetooth'}, 
  {'group_priority': 3, 'group': u'Entertainment', 'name': u'MP3'}, 
  {'group_priority': 3, 'group': u'Entertainment', 'name': u'Navigation system'}, 
  {'group_priority': 4, 'group': u'Extra', 'name': u'Alloy wheels'}, 
  {'group_priority': 4, 'group': u'Extra', 'name': u'Trailer hitch'}, 
  {'group_priority': 4, 'group': u'Extra', 'name': u'Winter tyres'}, 
  {'group_priority': 4, 'group': u'Security', 'name': u'Xenon headlights'}]

I want to order it by group_priority and group it by group and show it in Django template/

What I have tried:

options_grouped_dict = {}
for item in options_grouped:
    options_grouped_dict.setdefault(item['group'], []).append(item['name'])

And then in Django template:

{% for key, values in car.options_grouped.items %}
    <div>
        <div><strong>{{key}}</strong></div>
        {% for option in values %}
            <div>
                {% if option|length > 31 %}
                    {{ option|truncatechars:34 }}
                {% else %}
                    {{ option }}
                {% endif %}
            </div>
        {% endfor %}
    </div>
{% endfor %} 

But it isn't ordered by group_priority. I get group security on first place instead of group Comfort

Any advice?

Upvotes: 0

Views: 700

Answers (2)

Boky
Boky

Reputation: 12054

I solve it using Django's regroup.

The options list is as follows:

options = [
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Air conditioning'}, 
  {'group_priority': 2, 'group': u'Comfort', 'name': u'Air suspension'},  
  {'group_priority': 3, 'group': u'Entertainment', 'name': u'Bluetooth'}, 
  {'group_priority': 3, 'group': u'Entertainment', 'name': u'MP3'}, 
  {'group_priority': 3, 'group': u'Entertainment', 'name': u'Navigation system'}, 
  {'group_priority': 4, 'group': u'Extra', 'name': u'Alloy wheels'}, 
  {'group_priority': 4, 'group': u'Extra', 'name': u'Trailer hitch'},  
  {'group_priority': 4, 'group': u'Security', 'name': u'Xenon headlights'}]

And I have passed it (options) to the template as follows car['options_grouped'] = options

And then in the template I did as follows:

{% regroup car.options_grouped by group as groups %}
{% for group in groups %}
  <div>{{ group.grouper }}</div>
  {% for option in group.list %}
    <div> {{ option.name }}</div>
  {% endfor %}
{% endfor %}

Upvotes: 2

Bernhard
Bernhard

Reputation: 1273

If you want an orderedDict with dicts grouped by group and ordered by group_prioritythis should work:

#grouping in Dict with group as key and list of dict as value:    
grouped_dict={}
for option in options:
    if option['group'] in grouped_dict.keys():
        grouped_dict[option['group']].append(option)
    else:
        grouped_dict[option['group']] = [option]

#sorting by group_priority
ordered = OrderedDict(sorted(grouped_dict.items(), key=lambda t:t[1][0].get('group_priority')))

print(ordered)

Upvotes: 1

Related Questions