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

求优雅又高效率的写法,对字典列表,根据字典的多个 k,v 键值对,去重复。。。

  •  
  •   uti6770werty · 2020-09-07 18:11:19 +08:00 · 2582 次点击
    这是一个创建于 1536 天前的主题,其中的信息可能已经有所发展或是发生改变。
    [{'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'}]
    

    只判断姓名,体重即可
    自己现在写的算法,是 for,for,if,if 循环历遍这样判断,最后还是能能弄出来的,
    看到网上也貌似有一些一行有 lambda 搞定的优雅写法,只能学习到以一个键值对做判断的写法。。。。

    19 条回复    2020-10-24 18:54:51 +08:00
    teawithlife
        1
    teawithlife  
       2020-09-07 18:18:24 +08:00
    将姓名和体重拼成一个字符串,然后按这个新字符串去重就可以了
    LokiSharp
        2
    LokiSharp  
       2020-09-07 18:22:48 +08:00 via iPhone
    lambda 就是语法糖,没必要强求
    dongxiao
        3
    dongxiao  
       2020-09-07 18:23:53 +08:00 via Android   ❤️ 1
    这就是 SQL 根据某几个字段 distinct 吧,可以用 pandas 转成 DataFrame 然后 drop_duplicates,设置 subset 即可,或者用空间换时间,建个 set 存储已见到的数据 tuple,不在 set 内则追加新列表,一遍循环即可
    vipppppp
        4
    vipppppp  
       2020-09-07 18:37:47 +08:00
    一些语法糖本质上都是遍历,关键是回头看的时候又是一脸懵逼。。
    借助一个 set 来过滤应该性能上是最高的吧
    ruanimal
        5
    ruanimal  
       2020-09-07 18:46:09 +08:00
    >>> from itertools import groupby
    ...
    ... data = [
    ... {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    ... {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    ... {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    ... {'姓名':'张三','体重':76,'UpdateTime':'xxx'}
    ... ]
    ...
    ... helper = lambda i: (i['姓名'], i['体重'])
    ... result = [list(values)[0] for _, values in groupby(sorted(data, key=helper), key=helper)]
    ruanimal
        6
    ruanimal  
       2020-09-07 18:48:40 +08:00
    解法 2

    data = [
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'}
    ]

    result_map = {}

    for i in data:
    result_map[(i['姓名'], i['体重'])] = i
    result = list(result_map.values())
    imn1
        7
    imn1  
       2020-09-07 18:49:25 +08:00
    dict1.items() & dict2.items()

    自己看看结果,剩下的自己写吧
    weyou
        8
    weyou  
       2020-09-07 18:52:24 +08:00   ❤️ 3
    data = [
    {'姓名':'王二','体重':60,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':70,'UpdateTime':'xxx'},
    {'姓名':'李四','体重':70,'UpdateTime':'xxx'},
    ]

    list({(r['姓名'], r['体重']): r for r in data}.values())
    imn1
        9
    imn1  
       2020-09-07 18:54:51 +08:00
    还有
    dict1.items() - dict2.items()

    同上,怎么组合自己想吧
    wysnylc
        10
    wysnylc  
       2020-09-07 19:01:43 +08:00
    TimePPT
        11
    TimePPT  
       2020-09-07 19:56:49 +08:00   ❤️ 3
    import pandas as pd

    data = [{'姓名':'张三','体重':76,'UpdateTime':'2019-09-09'},
    {'姓名':'张三','体重':76,'UpdateTime':'2020-03-20'},
    {'姓名':'张三','体重':76,'UpdateTime':'2020-08-11'},
    {'姓名':'张三','体重':76,'UpdateTime':'2020-09-06'}]

    df = pd.DataFrame(data=data)
    df_uniq = df.drop_duplicates(subset=['姓名', '体重'])

    df_uniq
    aijam
        12
    aijam  
       2020-09-08 05:20:09 +08:00
    list({(d['姓名'], d['体重']): d for d in data}.values())
    billgreen1
        13
    billgreen1  
       2020-09-09 10:00:22 +08:00
    sort_key = lambda doc:(doc['姓名‘], doc['体重'])

    [next(iterator) for key, iterator in itertools.groupby(sorted(data, key=sort_key), key = sort_key)]
    HiddenNPC
        14
    HiddenNPC  
       2020-09-09 16:22:03 +08:00
    data_list = [{'姓名': '张三', '体重': 76, 'UpdateTime': 'xxx'},
    {'姓名': '张三', '体重': 76, 'UpdateTime': 'xxx'},
    {'姓名': '张三', '体重': 76, 'UpdateTime': 'xxx'},
    {'姓名': '张三', '体重': 76, 'UpdateTime': 'xxx'}]

    print(reduce(lambda x, y: x if y in x else x + [y], [[], ] + data_list))

    # [{'姓名': '张三', '体重': 76, 'UpdateTime': 'xxx'}]
    Pzqqt
        15
    Pzqqt  
       2020-09-10 08:35:23 +08:00
    ```python
    l = [{'姓名':'张三','体重':76,'UpdateTime':'aaa'},
    {'姓名':'张三','体重':76,'UpdateTime':'bbb'},
    {'姓名':'张三','体重':76,'UpdateTime':'ccc'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'}]

    d = {}
    for i in range(len(l)):
    d = {**d, **l[i]}

    # d == {'姓名': '张三', '体重': 76, 'UpdateTime': 'xxx'}
    ```
    biglazycat
        16
    biglazycat  
       2020-09-11 21:29:08 +08:00
    dict_list = [{'姓名':'张三','体重':76,'UpdateTime':'xxx'}, {'姓名':'张三','体重':76,'UpdateTime':'xxx'}, {'姓名':'张三','体重':76,'UpdateTime':'xxx'}, {'姓名':'张三','体重':76,'UpdateTime':'xxx'}]

    list_dict = {}

    for i in dict_list:
    list_dict.setdefault((i['姓名'], i['体重']), []).append('')

    print(list_dict)
    biglazycat
        17
    biglazycat  
       2020-09-11 21:41:36 +08:00
    @weyou 大神,没看懂,请指点指点。
    weyou
        18
    weyou  
       2020-09-12 00:13:36 +08:00 via Android
    @biglazycat 通过字典解析式( dictionary comprehension )以(“姓名”“体重”)这个 tuple 为 key 生成新的字典用来去重,然后获取 values 就是去重后的结果了。
    biglazycat
        19
    biglazycat  
       2020-10-24 18:54:51 +08:00
    @weyou 大神好厉害,牛 B 。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1009 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:20 · PVG 06:20 · LAX 14:20 · JFK 17:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.