zoukankan      html  css  js  c++  java
  • Python对列表中字典元素排序

    问题起源

    json对象a,b

    a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}'
    b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}'

    特点:a,b对应的Python的对象中对应的键值——列表中包含着相同的字典元素,但是唯一不同的是顺序不同。如果忽略顺序,如何判断两个json是否相等。因为字典本身是自己按键排序的,列表是按加入的顺序排序的,如果对列表中的字典元素进行排序就可以轻松地排序了。如果列表中是普通的元素(不是字典),通过list(set())组合可以读列表进行排序,而列表中如果是字典元素不能使用list(set())组合,看提示:

    >>> a = [{'a':1, 'b':2}, {'c':3}]
    >>> a
    [{'a': 1, 'b': 2}, {'c': 3}]
    >>> b = set(a)
    
    Traceback (most recent call last):
      File "<pyshell#2>", line 1, in <module>
        b = set(a)
    TypeError: unhashable type: 'dict'
    

    提示为字典是不可进行哈希操作的类型(普通非字典的元素进行哈希操作即可轻松排好序)。

    那么问题的本质即:如何对列表中的字典元素排序。

    对列表中的字典元素排序

    还好,列表有sorted函数,试一下

    >>> p = [{'b': 2}, {'a': 1, 'c': 3}]
    >>> q = [{'a': 1, 'c': 3}, {'b': 2}]
    >>> p
    [{'b': 2}, {'a': 1, 'c': 3}]
    >>> q
    [{'a': 1, 'c': 3}, {'b': 2}]
    >>> pp = sorted(p)
    >>> qq = sorted(q)
    >>> pp
    [{'b': 2}, {'a': 1, 'c': 3}]
    >>> qq
    [{'b': 2}, {'a': 1, 'c': 3}]
    >>> pp == qq
    True
    >>> p == q
    False
    

    可以看出,ok的,并且可以看出排序的原则是元素个数。

    对json进行比较(忽略列表中字典的顺序)

    import json
    def compare_json(a, b):
        aa = json.loads(a)
        bb = json.loads(b)
    
        len_a = len(aa)
        len_b = len(bb)
        if len_a != len_b:
            return False
        else:
            for key in aa:
                if not bb.has_key(key):
                    return False
                else:
                    if sorted(aa[key]) != sorted(bb[key]):
                        return False
        return True
                        
    
    if __name__ == "__main__":
        a = '{"ROAD": [{"id": 123}, {"name": "no1"}]}'
        b = '{"ROAD": [{"name": "no1"}, {"id": 123}]}'
        print compare_json(a, b)

    细节:自己写json格式时,a = "{'road':1}"  json.loads(a) 错误,得写成a = '{"road:1}'  【单引号在外】

  • 相关阅读:
    Gradle with Kotlin (二) 项目、Java项目、父子、同级共享代码
    Gradle with Kotlin (一) 安装、DSL、任务、插件
    辛弃疾
    Remote Method Invoke
    Webpack (一) 选项和配置
    《芙蓉女兒誄》
    js 原型链之我见
    js 库
    Gradle
    Spring Boot 入门
  • 原文地址:https://www.cnblogs.com/kaituorensheng/p/4696340.html
Copyright © 2011-2022 走看看