【问题标题】:python and django: How to print a dictionary with specific rule on keyspython和django:如何在键上打印具有特定规则的字典
【发布时间】:2012-07-24 19:36:09
【问题描述】:

我构建了一个这样的数据结构:

{ level: [ event1, event2... ] }

level 是以下之一:C(代表临界)、H(代表高)、M(代表中)、L(代表低)。

我想根据级别打印django模板中的所有事件,首先是C(关键),然后是H(高),M(中),L(低)。但是,默认情况下,这就是我所拥有的:

{% for level, events in dictionary.items %}
    {% for event in events %}
        do something with level, event
    {% endfor %}
{% endfor %}

我先打印出 H(high),然后打印出 C(critical),等等。我想问:如何按特定顺序循环字典?还是应该将其转换为其他数据结构?谢谢。

编辑: 我认为史蒂夫的方法效果很好。它将字典转换为列表,字典的每个条目变成一个元组:

[ (level1: [event1, event2 ...]), (level2: [event3, event4 ...]) ]

【问题讨论】:

  • 请注意,订购和字典通常不能很好地结合在一起。

标签: python django sorting dictionary


【解决方案1】:

字典没有顺序,因此您需要先将它们转换为元组列表:

将它们排序如下:

level_values = {'C':0, 'H':1, 'M':2, 'L':3}
sorted_dictionary = sorted(dictionary.items(), key=lambda x: level_values[x[0]])

然后传入你的 sorted_dictionary 变量,并以与之前相同的方式循环它:

{% for level, events in sorted_dictionary %}
    {% for event in events %}
        do something with level, event
    {% endfor %}
{% endfor %}

重要声明的进一步解释:

sorted_dictionary = sorted(dictionary.items(), key=lambda x: level_values[x[0]])

dictionary.items() 给你一个元组列表,代表你的原始字典。所以不要像这样的字典:

{'A':[1,2,3], 'B',[4,5,6]}

如果为字典中的每个键/值对提供元组列表:

[('A', [1,2,3]), ('B', [4,5,6])]

您可以将元组视为无法更改的列表(据说是“不可变的”)。

然后将这个元组列表传递给sorted 函数。对于列表中的每个元组,sorted() 调用我们提供的 lambda 表达式来请求排序键。我们的 lambda 表达式只取元组中的第一个元素(即严重性值),然后访问 level_values 字典为其查找排序值。

您可以逐个元组地循环遍历生成的sorted_dictionary(这是一个元组列表):

for value in sorted_dictionary:
     print value[0]
     print str(value[1])

或者 Python 会让你自动将 tuble 拆分为单独的变量:

for severity, events in sorted_dictionary:
     print severity
     print str(events)

【讨论】:

  • 感谢您的回复,我不是python方面的专家,我尝试了您的方法,它给出了TypeError:()恰好需要1个参数(给定2个)?
  • 抱歉,我做了一些修改 - 你尝试了最新的吗?注意key= 关键字。 @da_zhuang
  • 行得通!据我所知,我猜它会将字典转换为列表?我应该如何循环呢?
  • @da_zhuang 我已经为我的答案添加了解释。我希望这会有所帮助!
  • 在您的帮助下,我已经完成了我的项目,谢谢伙计,拯救了我的一天
【解决方案2】:

您需要将其转换为其他数据结构。执行此操作的最简单方法是,而不是字典,将已排序的列表列表 [low_levels, medium_levels, high_levels] 或您喜欢的列表传递到您的模板中,然后对其进行迭代。如果可以的话,您不妨将其用作您的事件的表示。

【讨论】:

    【解决方案3】:

    Python dicts 未排序。您需要将其转换为列表并对其进行排序。

    converted = [
        ('C', mydict['C']),
        ('H', mydict['H']),
        ('M', mydict['M']),
        ('L', mydict['L']),
    ]
    

    然后在模板中:

    {% for level, events in converted %}
        {% for event in events %}
            do something with level, event
        {% endfor %}
    {% endfor %}
    

    或者,使用您的原始数据结构,只需遍历每个类别:

    {% for event in dictionary.C %}
        do something with event, this is for Critical
    {% endfor %}
    {% for event in dictionary.H %}
        do something with event, this is for High
    {% endfor %}
    {% for event in dictionary.M %}
        do something with event, this is for Medium
    {% endfor %}
    {% for event in dictionary.L %}
        do something with event, this is for Low
    {% endfor %}
    

    【讨论】:

    • 我认为你的第一个建议更有意义,你的第二个建议我已经尝试过了,但是代码行太多:)
    • @da_zhuang 我个人更喜欢第二种选择。发生的事情要明显得多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    相关资源
    最近更新 更多