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

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

  •  
  •   css3 · 2020-08-26 19:53:23 +08:00 · 2288 次点击
    这是一个创建于 1554 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我太笨了,就是各种 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 条回复    2020-08-28 15:17:53 +08:00
    cyspy
        1
    cyspy  
       2020-08-26 20:17:29 +08:00 via Android
    反着放到 dict 里再取出来
    lybcyd
        2
    lybcyd  
       2020-08-26 20:43:11 +08:00
    如果不同的 key 有相同的 value,该保留哪一个呢?
    css3
        3
    css3  
    OP
       2020-08-26 21:02:54 +08:00 via iPhone
    @lybcyd 就第一个吧
    css3
        4
    css3  
    OP
       2020-08-26 21:03:31 +08:00 via iPhone
    测试了一下,我这一坨还有 bug😂
    css3
        5
    css3  
    OP
       2020-08-26 21:07:46 +08:00 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  
       2020-08-26 21:08:43 +08:00
    ```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  
       2020-08-26 21:11:09 +08:00
    忘了转成 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  
       2020-08-26 21:22:04 +08:00
    平时 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  
       2020-08-26 21:22:14 +08:00
    这个结构太奇怪了,字典套列表再套只会有一个元素的字典是什么操作,字典套字典不行吗?
    ipwx
        10
    ipwx  
       2020-08-26 21:40:02 +08:00
    其实楼主你有没有发现,一行写法更难读。。。

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


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

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

    wwf
        20
    wwf  
       2020-08-28 15:17:53 +08:00
    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)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1181 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 18:37 · PVG 02:37 · LAX 10:37 · JFK 13:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.