V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
misaka19000
V2EX  ›  Python

Python 有什么好的办法比较两个 JSON list 的差异?

  •  
  •   misaka19000 ·
    RitterHou · 2017-07-09 19:02:58 +08:00 · 5729 次点击
    这是一个创建于 2699 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有 list A 与 list B,list 中的每一个元素是一个 JSON 对象,请问有什么好的方式来比较两个 list 中存在差异的部分呢?

    例如:

    list A:[json1, json2, josn3]

    list B:[json1, json2, josn3]

    我想要比较这两个 list 是否完全一样或者存在着怎样的差异,请问最好的解决方式是什么?

    15 条回复    2017-07-12 08:32:37 +08:00
    noli
        1
    noli  
       2017-07-09 19:08:07 +08:00 via iPhone
    把 list 变成 set,再用交集并集运算
    misaka19000
        2
    misaka19000  
    OP
       2017-07-09 19:19:55 +08:00 via Android
    @noli list 中可能存在重复元素,这些元素个数也需要一致。。
    bazingaterry
        3
    bazingaterry  
       2017-07-09 19:22:30 +08:00 via iPhone
    先转成字符串再对比?
    JhZ7z587cYROBgVQ
        4
    JhZ7z587cYROBgVQ  
       2017-07-09 19:22:45 +08:00
    用 collections.Counter([iterable-or-mapping]) 做做看呢?
    noli
        5
    noli  
       2017-07-09 19:30:27 +08:00
    @misaka19000 那你可以包一个 python 对象再放进 set 里面,这个 python 对象指出 json 在原 list 里面的 index,这样他们的 __hash__ 不一样,甚至你还可以自己再重载一下 __hash__
    zeroten
        6
    zeroten  
       2017-07-09 19:33:18 +08:00   ❤️ 1
    这个 https://bitbucket.org/vadim_semenov/json_tools/wiki/Home 或者其他 json 比较的包
    carlonelong
        7
    carlonelong  
       2017-07-10 00:14:10 +08:00
    把 json load 出来 sort 比较?
    我记得有专门比较 json 的库的,GitHub 上面应该能找到。
    noobsheldon
        8
    noobsheldon  
       2017-07-10 08:52:48 +08:00
    dictdiffer 可以试试
    sunwei0325
        9
    sunwei0325  
       2017-07-10 09:11:20 +08:00
    @noobsheldon 这个库好👍
    ToBeHacker
        10
    ToBeHacker  
       2017-07-10 10:11:08 +08:00
    感觉就是遍历啊,你用啥都绕不开这个的,只是用起来简便一点而已。
    livepps
        11
    livepps  
       2017-07-10 11:56:50 +08:00 via Android
    排序一下,格式化成字符串,然后用自带的 diff 库比较,这个库比对差异效率非常高。
    misaka19000
        12
    misaka19000  
    OP
       2017-07-10 12:13:46 +08:00 via Android
    @livepps 谢谢,我待会儿试一下
    ikeeper
        13
    ikeeper  
       2017-07-12 08:25:03 +08:00
    for x,y in zip(list1,list2):
    if x == y:
    print(1)
    else:
    print(0)
    #小白表示这样不行吗
    ikeeper
        14
    ikeeper  
       2017-07-12 08:25:49 +08:00
    @ikeeper 原来 V2EX 没法显示缩进
    misaka19000
        15
    misaka19000  
    OP
       2017-07-12 08:32:37 +08:00 via Android
    @ikeeper 两个 list 顺序可能不一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3098 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:10 · PVG 22:10 · LAX 06:10 · JFK 09:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.