V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
推荐学习书目
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
4everLoveU
V2EX  ›  Python

python,子元素为 dict 的 list,如何快速去交集?

  •  
  •   4everLoveU · Jan 8, 2016 · 3558 views
    This topic created in 3764 days ago, the information mentioned may be changed or developed.
    三个 list ,每个 list 的子元素都是 dict
    怎么样快速完成取交集和并集操作?

    list 的长度大约 1000 左右
    13 replies    2016-01-26 17:31:55 +08:00
    Valyrian
        1
    Valyrian  
       Jan 8, 2016
    取三个 list 的并集? dict 不是 hashable 的,会很麻烦
    firemiles
        2
    firemiles  
       Jan 8, 2016
    是以 dict 为最小单位交并还是以 dict 中的键值对为最小单位交并
    dawncold
        3
    dawncold  
       Jan 9, 2016
    把 dict 变成 hashable 的,然后转成 set 做交
    langyu
        4
    langyu  
       Jan 9, 2016
    长度 1000 的话, 咋做都是一样的, 差不了几毫秒
    billgreen1
        5
    billgreen1  
       Jan 9, 2016
    dict.items() 返回的是一个元组,对这个元组排序。 也就是 dict ---> 有序的元组。
    这样列表中的元素就是有序元组了。可以用 set
    HikiJoy
        6
    HikiJoy  
       Jan 9, 2016
    全部转成 JSON
    xjoker
        7
    xjoker  
       Jan 10, 2016 via iPhone
    set 可以么
    Feiox
        8
    Feiox  
       Jan 10, 2016
    把每个 dict 包裹进一个对象,设置一定规则取 __hash__ 然后吧这些对象丢进 set 中去并集,然后在取出。。。。
    shajiquan
        9
    shajiquan  
       Jan 10, 2016
    intersection = lambda a, b, c: \
    [ \
    dict(t) for t in \
    set([ \
    tuple(da.items()) for da in a if \
    tuple(da.items()) in [tuple(db.items()) for db in b] and \
    tuple(da.items()) in [tuple(dc.items()) for dc in c] \
    ]) \
    ]
    shajiquan
        10
    shajiquan  
       Jan 10, 2016
    ```python

    intersection = lambda a, b, c: \
    [ \
    dict(t) for t in \
    set([ \
    tuple(da.items()) for da in a if \
    tuple(da.items()) in [tuple(db.items()) for db in b] and \
    tuple(da.items()) in [tuple(dc.items()) for dc in c] \
    ]) \
    ]

    ```
    lixiaohan
        11
    lixiaohan  
       Jan 11, 2016
    a = [.....] b = [......] c = [......]
    sa = set(tuple(aa.items()) for aa in a)
    sb = set(tuple(aa.items()) for aa in b)
    sc = set(tuple(aa.items()) for aa in c)

    sa&sb&sc
    这样就是交集了 是个 set(tuple)
    你再转一下 dict 很简单吧
    大概就是这样子 代码写的繁琐 但是分步写易懂
    shajiquan
        12
    shajiquan  
       Jan 11, 2016
    @lixiaohan 是的。这个需求这样来处理效率也挺低的。我在实际业务中只处理单个 list 中重复 dict ,楼主这个要 3 个 list ,每个 list 长度 1000 左右……
    mikezhang0515
        13
    mikezhang0515  
       Jan 26, 2016
    把子元素想办法弄成可 hash 对象,然后把 list 转换成 tuple ,然后去交集
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2744 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 60ms · UTC 14:05 · PVG 22:05 · LAX 07:05 · JFK 10:05
    ♥ Do have faith in what you're doing.