推荐学习书目
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 · Sep 7, 2020 · 3393 views
    This topic created in 2078 days ago, the information mentioned may be changed or developed.
    [{'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'},
    {'姓名':'张三','体重':76,'UpdateTime':'xxx'}]
    

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

    19 replies    2020-10-24 18:54:51 +08:00
    teawithlife
        1
    teawithlife  
       Sep 7, 2020
    将姓名和体重拼成一个字符串,然后按这个新字符串去重就可以了
    LokiSharp
        2
    LokiSharp  
       Sep 7, 2020 via iPhone
    lambda 就是语法糖,没必要强求
    dongxiao
        3
    dongxiao  
       Sep 7, 2020 via Android   ❤️ 1
    这就是 SQL 根据某几个字段 distinct 吧,可以用 pandas 转成 DataFrame 然后 drop_duplicates,设置 subset 即可,或者用空间换时间,建个 set 存储已见到的数据 tuple,不在 set 内则追加新列表,一遍循环即可
    vipppppp
        4
    vipppppp  
       Sep 7, 2020
    一些语法糖本质上都是遍历,关键是回头看的时候又是一脸懵逼。。
    借助一个 set 来过滤应该性能上是最高的吧
    ruanimal
        5
    ruanimal  
       Sep 7, 2020
    >>> 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  
       Sep 7, 2020
    解法 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  
       Sep 7, 2020
    dict1.items() & dict2.items()

    自己看看结果,剩下的自己写吧
    weyou
        8
    weyou  
       Sep 7, 2020   ❤️ 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  
       Sep 7, 2020
    还有
    dict1.items() - dict2.items()

    同上,怎么组合自己想吧
    wysnylc
        10
    wysnylc  
       Sep 7, 2020
    TimePPT
        11
    TimePPT  
    PRO
       Sep 7, 2020   ❤️ 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  
       Sep 8, 2020
    list({(d['姓名'], d['体重']): d for d in data}.values())
    billgreen1
        13
    billgreen1  
       Sep 9, 2020
    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  
       Sep 9, 2020
    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  
       Sep 10, 2020
    ```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  
       Sep 11, 2020
    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  
       Sep 11, 2020
    @weyou 大神,没看懂,请指点指点。
    weyou
        18
    weyou  
       Sep 12, 2020 via Android
    @biglazycat 通过字典解析式( dictionary comprehension )以(“姓名”“体重”)这个 tuple 为 key 生成新的字典用来去重,然后获取 values 就是去重后的结果了。
    biglazycat
        19
    biglazycat  
       Oct 24, 2020
    @weyou 大神好厉害,牛 B 。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   3218 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 55ms · UTC 14:48 · PVG 22:48 · LAX 07:48 · JFK 10:48
    ♥ Do have faith in what you're doing.