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

2020-09-07 18:11:19 +08:00
 uti6770werty
[{'姓名':'张三','体重':76,'UpdateTime':'xxx'},
{'姓名':'张三','体重':76,'UpdateTime':'xxx'},
{'姓名':'张三','体重':76,'UpdateTime':'xxx'},
{'姓名':'张三','体重':76,'UpdateTime':'xxx'}]

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

2422 次点击
所在节点    Python
19 条回复
teawithlife
2020-09-07 18:18:24 +08:00
将姓名和体重拼成一个字符串,然后按这个新字符串去重就可以了
LokiSharp
2020-09-07 18:22:48 +08:00
lambda 就是语法糖,没必要强求
dongxiao
2020-09-07 18:23:53 +08:00
这就是 SQL 根据某几个字段 distinct 吧,可以用 pandas 转成 DataFrame 然后 drop_duplicates,设置 subset 即可,或者用空间换时间,建个 set 存储已见到的数据 tuple,不在 set 内则追加新列表,一遍循环即可
vipppppp
2020-09-07 18:37:47 +08:00
一些语法糖本质上都是遍历,关键是回头看的时候又是一脸懵逼。。
借助一个 set 来过滤应该性能上是最高的吧
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
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
2020-09-07 18:49:25 +08:00
dict1.items() & dict2.items()

自己看看结果,剩下的自己写吧
weyou
2020-09-07 18:52:24 +08:00
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
2020-09-07 18:54:51 +08:00
还有
dict1.items() - dict2.items()

同上,怎么组合自己想吧
wysnylc
2020-09-07 19:01:43 +08:00
TimePPT
2020-09-07 19:56:49 +08:00
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
2020-09-08 05:20:09 +08:00
list({(d['姓名'], d['体重']): d for d in data}.values())
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
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
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
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
2020-09-11 21:41:36 +08:00
@weyou 大神,没看懂,请指点指点。
weyou
2020-09-12 00:13:36 +08:00
@biglazycat 通过字典解析式( dictionary comprehension )以(“姓名”“体重”)这个 tuple 为 key 生成新的字典用来去重,然后获取 values 就是去重后的结果了。
biglazycat
2020-10-24 18:54:51 +08:00
@weyou 大神好厉害,牛 B 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/704939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX