[Python]大家是喜欢用{}还是dict()创建字典? - V2EX
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
TankyWoo
V2EX    Python

[Python]大家是喜欢用{}还是dict()创建字典?

  •  
  •   TankyWoo
    tankywoo 2013-02-25 11:13:13 +08:00 12200 次点击
    这是一个创建于 4684 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最先开始我是用"{}",不过后来觉得"dict()"看起来舒服,逐渐改用 "dict()"了

    不过今早看了Doug Hellmann的一篇文章《The Performance Impact of Using dict() Instead of {} in CPython 2.7》 http://doughellmann.com/2012/11/the-performance-impact-of-using-dict-instead-of-in-cpython-2-7-2.html

    经过各种验证(不得不佩服大牛对技术的钻研精神,和对结论的严谨态度),一般情况下,还是"{}"的效率要高一些
    31 条回复    2015-11-27 02:07:36 +08:00
    nervouna
        1
    nervouna  
       2013-02-25 11:33:14 +08:00
    dict() 可读性更高,这个问题萝卜白菜吧。
    TankyWoo
        2
    TankyWoo  
    OP
       2013-02-25 12:34:47 +08:00
    @nervouna

    嗯,我也是因为可读性,后来才喜欢用dict()的

    现在感觉,如果是少量的创建字典,dict()应该看起来更舒服

    如果大量创建,为了效率则还是{}比较好
    jybox
        3
    jybox  
       2013-02-25 12:35:12 +08:00
    我不是很了解Python, 但类似这样的争议在其他语言也有.

    我觉得还是应该从编写方便、可读性方面来考虑, 至于解释器的问题, 如果问题明显, 人家早晚会改正的, 不明显的话忽略就是了.
    G0dBlessMe
        4
    G0dBlessMe  
       2013-02-25 12:40:05 +08:00
    dict()
    ipconfiger
        5
    ipconfiger  
       2013-02-25 13:39:14 +08:00   1
    这么用类似于
    def d(**kwargs):
    return kwargs

    然后就可以 d(a=1,b=2)
    其实dict还可以 dict([("a",1),("b",2)])
    TankyWoo
        6
    TankyWoo  
    OP
       2013-02-25 13:52:00 +08:00
    @ipconfiger

    dict([("a",1),("b",2)])
    这个用法还是第一次见到
    tonyseek
        7
    tonyseek  
       2013-02-25 14:41:46 +08:00   1
    大多数情况下第一眼看到 {} 会想到这是一个映射结构,因为 Python、Ruby、Javascript 等语言都这么约定的,所以我不觉得 {} 的可读性不如 dict()
    iEverX
        8
    iEverX  
       2013-02-25 16:11:06 +08:00
    @tonyseek 同意。。{}可读性差在哪里?
    TankyWoo
        9
    TankyWoo  
    OP
       2013-02-25 16:20:12 +08:00
    @iEverX
    不是说{}可读性差

    可能是因为不同的人,拥有其他语言背景不一样,所以对于我,可能对dict()感觉看起来更直观一些
    hit9
        10
    hit9  
       2013-02-25 16:28:47 +08:00
    dict() 我也不知道为森么
    wenbinwu
        11
    wenbinwu  
       2013-02-25 16:42:45 +08:00
    dict()
    CoX
        12
    CoX  
       2013-02-25 17:19:06 +08:00
    {} 感觉很省事啊
    windviki
        13
    windviki  
       2013-02-25 17:24:07 +08:00
    直接初始化还是觉得{}好看。
    dict comprehension在python2.6不行,要兼容的时候就只好dict([(), ()])这样了,里面的list用list comprehension生成。
    wenbinwu
        14
    wenbinwu  
       2013-02-25 20:07:22 +08:00
    联想一下, list是用list()还是[]
    Mattsive
        15
    Mattsive  
       2013-02-27 17:34:31 +08:00
    http://doughellmann.com/2012/11/the-performance-impact-of-using-dict-instead-of-in-cpython-2-7-2.html

    dict() 的效率比 {} 要慢好几倍,但为了代码的直观性还是建议用 dict()
    TankyWoo
        16
    TankyWoo  
    OP
       2013-02-27 18:07:22 +08:00
    @Mattsive

    我给的链接就是这篇文章。。。
    zhangxiao
        17
    zhangxiao  
       2013-02-28 00:04:55 +08:00
    {},可能js带的习惯吧
    est
        18
    est  
       2013-02-28 08:35:59 +08:00   1
    新建空dict用 a = {}

    深复制dict用 a = dict(b, newkey='newval') 更加优雅。
    mengzhuo
        19
    mengzhuo  
       2013-02-28 10:06:24 +08:00
    {}
    这个才是Pythonic的写法
    再说字典推导的时候能用dict()吗~
    TankyWoo
        20
    TankyWoo  
    OP
       2013-02-28 10:52:53 +08:00
    @mengzhuo

    In [1]: lst = [1,2,3]

    In [2]: dic = dict([(v, v*2) for v in lst])

    In [3]: dic
    Out[3]: {1: 2, 2: 4, 3: 6}

    dict()也可以实现的,不过麻烦些
    TankyWoo
        21
    TankyWoo  
    OP
       2013-02-28 10:56:55 +08:00
    @est

    深复制这里还没想到,这个不错!学习了!
    Js
        22
    Js  
       2013-02-28 11:15:46 +08:00
    不是海量创建字典还是用dict这个函数吧
    python新搞出了个{}创建set的语法, 一不小心把{'a':'b'}敲成{'a','b'}又没发现就了
    TankyWoo
        23
    TankyWoo  
    OP
       2013-02-28 11:41:32 +08:00
    @Js 嗯,我也是LS的@mengzhuo 提到字典推导,才去看了下这个特性,2.7出来的,以前没注意到

    可以生成set或dict
    Smartype
        24
    Smartype  
       2013-02-28 15:10:33 +08:00 ia iPad
    [], {} 都是Python的优点。
    非要说dict()易读,呵呵
    TankyWoo
        25
    TankyWoo  
    OP
       2013-02-28 15:22:25 +08:00
    @Smartype 这个“易读”是相对个人的,我只是说对于我来说,我感觉这个看起来更舒服

    而且楼上我也说了,这个是和写代码的人拥有的其他语言背景有关的。
    nervouna
        26
    nervouna  
       2013-03-05 15:45:39 +08:00
    @Smartype
    比方说,用两个 list 做字典
    keys = ['a', 'b', 'c']
    values = [1, 2, 3]

    # 用 {}
    D1 = {}
    for (k, v) in zip(keys, values): D[k] = v

    # 用 dict()
    D2 = dict(zip(keys, values))

    dict() 看起来会稍微直观一些。

    追求效率的话就用 C 去实现啦。
    Smartype
        27
    Smartype  
       2013-03-05 17:04:32 +08:00
    @nervouna 真没有什么有意义的理由。你这样就是为了了答案而出题。

    真不知道为什么不直接那样写。
    D1 = {
    'a': 1,
    'b': 2,
    'c': 3
    }

    习惯而已。其实不所谓好坏。我就觉得{}少敲几下键盘,也及其直观。任何语言都是要考虑效率的,当然不同语言对效率的要求不一样。最好别说Python不在乎效率,在乎效率就得用C。
    Smartype
        28
    Smartype  
       2013-03-05 17:07:56 +08:00
    这么说吧,静态 dict 当然直接用 {}, 动态构造显然 dict() 更方便
    nervouna
        29
    nervouna  
       2013-03-06 07:05:17 +08:00
    @Smartype 啊,而已。我有牛角尖了,哈哈。
    另,我用 Python 就是了很快出原型,所以就有考效率。也是我明的地方。
    TankyWoo
        30
    TankyWoo  
    OP
       2013-03-06 10:02:54 +08:00
    @nervouna
    @Smartype

    好了,也就是给大家那篇文章看看,这个没啥争议的,萝卜白菜的问题。

    大量创建肯定{}了,小量就随便了,作者在文中也提到了,越来越多人喜欢用dict(),但是具体原因也不清楚
    hijoker
        31
    hijoker  
       2015-11-27 02:07:36 +08:00
    @TankyWoo
    @est 怎么深复制??别误导人....
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5291 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 09:16 PVG 17:16 LAX 01:16 JFK 04:16
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86