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

求教 dict 的问题

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

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

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