python,子元素为 dict 的 list,如何快速去交集?

2016-01-08 23:14:58 +08:00
 4everLoveU
三个 list ,每个 list 的子元素都是 dict
怎么样快速完成取交集和并集操作?

list 的长度大约 1000 左右
2964 次点击
所在节点    Python
13 条回复
Valyrian
2016-01-08 23:29:54 +08:00
取三个 list 的并集? dict 不是 hashable 的,会很麻烦
firemiles
2016-01-08 23:29:56 +08:00
是以 dict 为最小单位交并还是以 dict 中的键值对为最小单位交并
dawncold
2016-01-09 00:53:59 +08:00
把 dict 变成 hashable 的,然后转成 set 做交
langyu
2016-01-09 01:56:46 +08:00
长度 1000 的话, 咋做都是一样的, 差不了几毫秒
billgreen1
2016-01-09 12:05:08 +08:00
dict.items() 返回的是一个元组,对这个元组排序。 也就是 dict ---> 有序的元组。
这样列表中的元素就是有序元组了。可以用 set
HikiJoy
2016-01-09 13:24:13 +08:00
全部转成 JSON
xjoker
2016-01-10 11:16:11 +08:00
set 可以么
Feiox
2016-01-10 12:30:08 +08:00
把每个 dict 包裹进一个对象,设置一定规则取 __hash__ 然后吧这些对象丢进 set 中去并集,然后在取出。。。。
shajiquan
2016-01-10 16:07:45 +08:00
intersection = lambda a, b, c: \
[ \
dict(t) for t in \
set([ \
tuple(da.items()) for da in a if \
tuple(da.items()) in [tuple(db.items()) for db in b] and \
tuple(da.items()) in [tuple(dc.items()) for dc in c] \
]) \
]
shajiquan
2016-01-10 16:08:01 +08:00
```python

intersection = lambda a, b, c: \
[ \
dict(t) for t in \
set([ \
tuple(da.items()) for da in a if \
tuple(da.items()) in [tuple(db.items()) for db in b] and \
tuple(da.items()) in [tuple(dc.items()) for dc in c] \
]) \
]

```
lixiaohan
2016-01-11 10:28:29 +08:00
a = [.....] b = [......] c = [......]
sa = set(tuple(aa.items()) for aa in a)
sb = set(tuple(aa.items()) for aa in b)
sc = set(tuple(aa.items()) for aa in c)

sa&sb&sc
这样就是交集了 是个 set(tuple)
你再转一下 dict 很简单吧
大概就是这样子 代码写的繁琐 但是分步写易懂
shajiquan
2016-01-11 13:40:44 +08:00
@lixiaohan 是的。这个需求这样来处理效率也挺低的。我在实际业务中只处理单个 list 中重复 dict ,楼主这个要 3 个 list ,每个 list 长度 1000 左右……
mikezhang0515
2016-01-26 17:31:55 +08:00
把子元素想办法弄成可 hash 对象,然后把 list 转换成 tuple ,然后去交集

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

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

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

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

© 2021 V2EX