首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Python正确地对字典列表进行排序和分组

如何用Python正确地对字典列表进行排序和分组
EN

Stack Overflow用户
提问于 2018-09-14 05:02:21
回答 2查看 513关注 0票数 0

我在Python中有一个dict列表如下:

代码语言:javascript
复制
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'}]

我想按group_priority订购它,并按group分组,然后在Django模板/

我试过的是:

代码语言:javascript
复制
options_grouped_dict = {}
for item in options_grouped:
    options_grouped_dict.setdefault(item['group'], []).append(item['name'])

然后在Django模板中:

代码语言:javascript
复制
{% 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 %} 

但它不是由group_priority订购的。我得到security组的第一名,而不是Comfort

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-14 06:41:10

我使用Django的重组来解决这个问题。

备选方案清单如下:

代码语言:javascript
复制
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'}]

我将它(options)传递给模板,如下所示:car['options_grouped'] = options

然后,在模板中,我做了如下操作:

代码语言:javascript
复制
{% 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 %}
票数 2
EN

Stack Overflow用户

发布于 2018-09-14 05:21:58

如果您希望orderedDict具有按group分组并按group_priority排序的dicts,则应该可以这样做:

代码语言:javascript
复制
#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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52325235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档