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 · 11776 次点击
    这是一个创建于 4276 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最先开始我是用"{}",不过后来觉得"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, 但类似这样的争议在其他语言也有.

    我觉得还是应该从编写方便、可读性方面来考虑, 至于解释器的问题, 如果问题明显, 人家早晚会改正的, 不明显的话忽略就是了.
    goxofy
        4
    goxofy  
       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 via 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   ·   实用小工具   ·   2682 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 06:26 · PVG 14:26 · LAX 22:26 · JFK 01:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.