Python对列表中字典元素排序

问题起源

json对象a,b

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

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

1
2
3
4
5
6
7
8
9
>>> 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函数,试一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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}'  【单引号在外】




本文转自jihite博客园博客,原文链接:http://www.cnblogs.com/kaituorensheng/p/4696340.html,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值