求教 dict 的问题

2018-09-19 09:53:54 +08:00
 pkokp8
有一个 dict
会不断插入键值,插入顺序是反着来的
比如 3:3,2:2,1:1,0:0(key value 都不重复)
插入特定 value 的时候需要把这一次插入的位置之前的所有 k:v 全部删掉
key 可能是跳跃的,比如 0,2,3,5
我是有一个蠢办法。dict 为空时直接插入,设置一个额外的非空标志位。非空先插入,然后从头开始 pop,与刚才插入的相同时停止丢弃并重新插入
不过第六感告诉我这太蠢了,应该有更好的办法
py 用的非常少,所以来发帖向大佬求教一下方法拓展思路
2000 次点击
所在节点    Python
17 条回复
pkokp8
2018-09-19 09:57:20 +08:00
比如 key 是 0,1,2
插入 4 时 value 是普通的,插入
插入 3 时发现 value 满足了某个条件,那么得把 0,1,2 删掉
dict 要么为空,要么只能且必定有一个满足条件的 value
zwzmzd
2018-09-19 10:05:54 +08:00
需要的时候直接创建新字典就好了,不知道你的应用场景是啥
dict={3:vlaue}
mengzhuo
2018-09-19 10:11:52 +08:00
这个字典会很大吗?(比如上 MB )
不大的话直接标记有效 index 就好了。
pkokp8
2018-09-19 10:16:38 +08:00
@zwzmzd 获取某个网页的回帖数据
特定回帖信息以前的楼层都需要忽略,并维护一个有效的楼层字典
每隔 1 小时获取一次,可能出现新的特定回复楼层,新楼层数量不会很多

我想错了,我现在第一次获取了所有楼层的数据,第二次只获取少量数据。之前想着增量维护

既然间隔这么长,我只需要获取所有的就行了,浪费了点流量,就没有这个问题了,我蠢了
此外即使增量,也可以如你说的加一个字典然后合并,效率不够用空间来换。长期使用资源紧缺的环境,切换到 py 脑子没转过来
jmc891205
2018-09-19 10:17:11 +08:00
你既然可以保证插入的时候 key value 都是唯一的 那没必要用 dict 直接用 list 就可以
pkokp8
2018-09-19 10:17:39 +08:00
@mengzhuo 这个不确定。如果一直没出现新的特定 value,可能会越来越大的
pkokp8
2018-09-19 10:20:49 +08:00
@jmc891205 考虑过,不过 list 得手动排序,dict 自己能帮我排好序,key 是楼层号,考虑什么时候去排个序比较累我就换 dict 了
SuperMild
2018-09-19 10:27:25 +08:00
是这样吗,假设现有 5, 4, 3, 2, 1 楼,其中 3 楼满足条件,2, 1 楼被抛弃,假设下次获取时有 6 楼,就把 6 楼加进来。
eloah
2018-09-19 10:31:46 +08:00
这种情况不是用链表好多了,为何一定要用 dict
Hieast
2018-09-19 10:32:04 +08:00
考虑过 ordereddict 么,你重写一个 getitem 的魔术方法就是可以切片了。
pkokp8
2018-09-19 10:37:48 +08:00
@eloah list 需要排序,而每个元素没有排序的属性。我就获取了每个元素的 id,id 和元素作为键值,dict 就能帮我排序了。有别的方法吗
jmc891205
2018-09-19 10:40:53 +08:00
@pkokp8 手动排序?每次插入的时候做一个二分查找就够了 没必要做排序。
当然看你前面回帖里的需求 数据量很小 随便你怎么做都可以。
pkokp8
2018-09-19 10:41:46 +08:00
@SuperMild
1 满足,加入 12
3 满足,抛弃 12,加入 345
6 满足,抛弃 345,加入 6
pkokp8
2018-09-19 10:44:43 +08:00
@jmc891205 可是天然的就有楼层号帮我排序,我还得做二分是不是多此一举了。用了 list 反而要多一个二分插入函数,结果貌似也没很方便
PythonAnswer
2018-09-19 10:45:25 +08:00
没必要。你 http 得来的是全部数据。
pkokp8
2018-09-19 10:50:01 +08:00
@PythonAnswer 看文档说,获取楼层数据有一个参数,all 或者默认。默认 20 个。没看过实现,不知道是不是全部数据,由于新增数据不可能多,我一开始想着增量获取,现在想想获取全部算了,数据量貌似也不太
lance6716
2018-09-19 13:18:27 +08:00
看不懂表述,像是单调队列

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

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

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

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

© 2021 V2EX