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
css3
V2EX  ›  Python

Python 字典中按 value 合并,有没有简单的写法?

  •  
  •   css3 · Aug 26, 2020 · 2806 views
    This topic created in 2082 days ago, the information mentioned may be changed or developed.

    我太笨了,就是各种 for

    把 tmp 按其 value 去重(取第一个), ret 为结果

    tmp = {
        "a": [
            {"a1": "tom"},
            {"a2": "jery"},
            {"a3": "jery"},
            {"a4": "cao"},
            {"a5": "cao"},
        ],
        "b": [
            {"b1": "lily"},
            {"b2": "lily"},
            {"bn": "jack"},
        ]
    }
    
    ret = {
        "a": [
            {"a1": "tom"},
            {"a2": "jery"},
            {"a4": "cao"}
        ],
        "b": [
            {"b1": "lily"},
            {"bn": "jack"}
        ]
    }
    

    我自己半天写了这一坨,着实费劲,有没有简单的写法😭😭😭😭😭😭

    _sort = {}
    t = []
    for k, v in tmp.items():
        _sort[k] = []
        for i in v:
            if list(i.values())[0] not in t:
                t.append(list(i.values())[0])
                _sort[k].append(i)
    print(_sort)
    
    20 replies    2020-08-28 15:17:53 +08:00
    cyspy
        1
    cyspy  
       Aug 26, 2020 via Android
    反着放到 dict 里再取出来
    lybcyd
        2
    lybcyd  
       Aug 26, 2020
    如果不同的 key 有相同的 value,该保留哪一个呢?
    css3
        3
    css3  
    OP
       Aug 26, 2020 via iPhone
    @lybcyd 就第一个吧
    css3
        4
    css3  
    OP
       Aug 26, 2020 via iPhone
    测试了一下,我这一坨还有 bug😂
    css3
        5
    css3  
    OP
       Aug 26, 2020 via iPhone
    @css3 就是不同 keykey 的 value 可以允许重复

    tmp = {
    "a": [
    {"a1": "tom"},
    {"a2": "jery"},
    {"a3": "jery"},
    {"a4": "cao"},
    {"a5": "cao"},
    ],
    "b": [
    {"b1": "lily"},
    {"b2": "lily"},
    {"bn": "jack"},
    {"bb": "tom"}
    ]
    }

    ret = {
    "a": [
    {"a1": "tom"},
    {"a2": "jery"},
    {"a4": "cao"}
    ],
    "b": [
    {"b1": "lily"},
    {"bn": "jack"},
    {"bb": "tom"}
    ]
    }
    ruyu
        6
    ruyu  
       Aug 26, 2020
    ```py
    [(k, [(n, m) for m, n in dict([reversed(next(iter(i.items()))) for i in v]).items()]) for k, v in tmp.items()]
    ```

    这样?
    ruyu
        7
    ruyu  
       Aug 26, 2020
    忘了转成 dict 了. 那就这样?

    dict([(k, dict([(n, m) for m, n in dict([reversed(next(iter(i.items()))) for i in v]).items()])) for k, v in tmp.items()])
    Death
        8
    Death  
       Aug 26, 2020
    平时 python 写的不多,试着写了一下

    ```
    ret={key:list(reversed([{v:k} for k,v in {y:x for d in reversed(val) for x,y in d.items()}.items()])) for key,val in tmp.items()}
    ```
    djFFFFF
        9
    djFFFFF  
       Aug 26, 2020
    这个结构太奇怪了,字典套列表再套只会有一个元素的字典是什么操作,字典套字典不行吗?
    ipwx
        10
    ipwx  
       Aug 26, 2020
    其实楼主你有没有发现,一行写法更难读。。。

    所以一步一步做是坠好的。
    Trim21
        11
    Trim21  
       Aug 26, 2020
    封装成个函数用的时候也是一行(强行
    BiteTheDust
        12
    BiteTheDust  
       Aug 26, 2020
    应该反过来存储 合理存放数据结构很重要
    billgreen1
        13
    billgreen1  
       Aug 27, 2020
    [
    {"a1": "tom"},
    {"a2": "jery"},
    {"a3": "jery"},
    {"a4": "cao"},
    {"a5": "cao"},
    {"a6": "jery"},
    ],


    这种情况如何处理?@楼主
    css3
        14
    css3  
    OP
       Aug 27, 2020
    @css3 @cyspy @lybcyd @ruyu @Death @djFFFFF @ipwx @Trim21 @BiteTheDust @billgreen1
    感谢各位,我等下挨个试试,嘿嘿
    css3
        15
    css3  
    OP
       Aug 27, 2020
    @billgreen1
    按里边字典的 value 去重就行,保留第一个
    [
    {"a1": "tom"},
    {"a2": "jery"},
    {"a4": "cao"},
    ],
    skinny
        16
    skinny  
       Aug 27, 2020
    不要在复杂数据结构和逻辑下写所谓的一行代码,看上去高大上,实际难读难以理解没卵用,先不提以后再读和维护时的酸爽,写的时候你也多浪费了很多脑细胞和时间。
    ipwx
        17
    ipwx  
       Aug 28, 2020
    @skinny 我也是这个观点(如果是纯 python 处理代码)

    但反过来,如果要处理几十万行几百万行这种,python 就超慢的,不得不诉诸于 pandas 那种。就会是另一种感觉了
    zunsgm
        18
    zunsgm  
       Aug 28, 2020
    @skinny
    @ipwx
    @ruyu
    初学者,大佬们能分解下不?
    ipwx
        19
    ipwx  
       Aug 28, 2020
    @zunsgm 你自己的那个版本改改不就行了?

    oP6Vjjm95MR4Ht2O
        20
    oP6Vjjm95MR4Ht2O  
       Aug 28, 2020
    def unpack(lst):
    value_set = set()
    new_lst = []
    for i in lst:
    for k, v in i.items():
    if not value_set:
    value_set.add(v)
    new_lst.append(i)
    if v in value_set:
    continue
    value_set.add(v)
    new_lst.append(i)
    return new_lst


    ret = {}
    for k, v in tmp.items():
    ret[k] = unpack(v)
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   936 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 51ms · UTC 22:35 · PVG 06:35 · LAX 15:35 · JFK 18:35
    ♥ Do have faith in what you're doing.