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

都说 python 数据结构丰富,丰富在哪?

  •  
  •   doer233 · 2016-11-16 18:25:49 +08:00 · 7378 次点击
    这是一个创建于 2928 天前的主题,其中的信息可能已经有所发展或是发生改变。

    当人们谈论起 python 时都乐于说 python 优雅,数据结构丰富。本人值接触过 python 语言,没有其他语言的编程经验,请问又那些数据结构是 python 中有而其他语言中没有的。

    68 条回复    2016-11-26 20:47:40 +08:00
    miketeam
        1
    miketeam  
       2016-11-16 18:27:37 +08:00 via iPhone
    Swift 笑而不语!不过我也喜欢 python
    shyling
        2
    shyling  
       2016-11-16 18:29:42 +08:00
    什么 list,dict,set,tuple 咯
    cheetah
        3
    cheetah  
       2016-11-16 18:31:51 +08:00
    可以看看 collections 里的几个
    tinyproxy
        4
    tinyproxy  
       2016-11-16 18:35:20 +08:00
    骚年,来学个 C 你就知道了。。。看各种代码见过好几种 struct whatever_str; 而且实现的功能都差不太多。
    est
        5
    est  
       2016-11-16 18:38:14 +08:00
    不丰富。不如 j8 丰富。
    chengluyu
        6
    chengluyu  
       2016-11-16 18:43:03 +08:00   ❤️ 3
    之所以这么说不是因为 Python 能做其他语言不能做的事,而是 Python 有这庞大的开发者社群,开发了数不胜数的库,你只需要 pip install 后 import 就可以直接使用了,而不需要自己从头造轮子。理论上来讲,任何图灵完备的语言描述能力都是的等价的,所以不存在有什么数据结构是 Python 有但是其它语言没有的。

    当然,这里讨论的「语言」都是指用于生产环境的命令式语言,不包括一些 DSL 。
    dtfm
        7
    dtfm  
       2016-11-16 18:56:58 +08:00   ❤️ 10
    Python 的数据结构丰富和其他语言应该是等价的,但易用度明显甩开某些语言(此处不指名道姓)一个台阶。

    举个栗子:
    一个脸滚键盘的字符串 V2EX = 'ebreredfdfhdlfhferdlhgfdnhe'
    求出里面包含的字符及字符出现的次数?

    Python 用推导式一梭子就出来 v2ex_count = { str : v2ex.count(str) for str in set( V2EX )}

    让我回忆起以前用 Java 摇曳的青春
    doer233
        8
    doer233  
    OP
       2016-11-16 19:06:53 +08:00
    @dtfm 嗯,这样解释很 pythonic
    doer233
        9
    doer233  
    OP
       2016-11-16 19:08:27 +08:00
    @shyling 这些结构其他语言也有的。我刚刚理解的‘丰富’是人无我有呢。
    doer233
        10
    doer233  
    OP
       2016-11-16 19:09:15 +08:00
    @chengluyu 嗯。赞同。
    ivechan
        11
    ivechan  
       2016-11-16 19:12:39 +08:00   ❤️ 1
    数据结构跟语言有多大关系....
    python 是易用和可读性比较好把.
    shyling
        12
    shyling  
       2016-11-16 19:35:28 +08:00
    @doer233 确实有啊。。但不一定是直接可用的。。。
    huntzhan
        13
    huntzhan  
       2016-11-16 19:39:22 +08:00
    没有默认平衡树......
    dexterzzz
        14
    dexterzzz  
       2016-11-16 19:46:55 +08:00
    python 写的好就是在写英文一样,就像写伪代码一样。
    AyoCross
        15
    AyoCross  
       2016-11-16 20:00:15 +08:00
    同意楼上,作为一个低端程序员, python 的可读性让我写代码的时候有种写伪代码的感觉, list tuple set dict 拿来就用,也不用怕野指针、资源没释放导致内存泄漏,比 C/C++爽多了。。
    Tahw
        16
    Tahw  
       2016-11-16 20:15:23 +08:00
    @dtfm collection.Counter(V2EX)
    Tahw
        17
    Tahw  
       2016-11-16 20:16:17 +08:00
    collections ,少了个 s
    dtfm
        18
    dtfm  
       2016-11-16 20:30:31 +08:00
    @Tahw 对,一时没想起来,其实你这个更 Pythonic , collections 是真好用。
    liuxingou
        19
    liuxingou  
       2016-11-16 20:35:47 +08:00
    数据结构往往是抽象的吧,未必就用语言本身提供的啊,楼上说得好, Python 最大魅力是日常轻度使用的门槛低,周期短,可读性好。
    billlee
        20
    billlee  
       2016-11-16 22:24:13 +08:00
    你去看看 C, 基本数据结构都没有提供;自己写出来的还要么不能泛型,要么就类型不安全。
    guoziyan
        21
    guoziyan  
       2016-11-16 22:40:42 +08:00
    多不多不敢保证,很灵活倒是真的
    myid
        22
    myid  
       2016-11-16 22:45:06 +08:00
    @billlee C 没有提供基本数据结构--这种看法不严谨。 C 语言本身的确没有提供一些常用的数据结构--例如字典、集合等,而 C 语言可用的众多库还是提供了众多的数据结构实现。

    C 和 Python 定位不同。 C 追求效率和灵活;赋予程序员极大的自由和特权去使用计算资源和优化计算--这是程序员喜爱的 C 的原因之一。
    zzcflying
        23
    zzcflying  
       2016-11-16 23:07:00 +08:00
    python 优势在于灵活吧
    HuangLibo
        24
    HuangLibo  
       2016-11-16 23:07:25 +08:00
    @myid C 的哪些库给了高可用的高级数据结构的实现,可以丢给链接吗
    mingyun
        25
    mingyun  
       2016-11-16 23:14:58 +08:00
    @dtfm nice
    Senevan
        27
    Senevan  
       2016-11-16 23:32:47 +08:00 via Android
    内部的 list tuple dict 不用自己实现,不够用就用 collections 的
    introom
        28
    introom  
       2016-11-16 23:43:29 +08:00 via Android
    一点都不丰富,你看那个 heap,要多难用有多难用
    billlee
        29
    billlee  
       2016-11-17 00:11:03 +08:00
    @myid C 语言本身的限制让泛型的数据结构实现都要用类型不安全的 void*, 这个东西在大型项目中就是噩梦。
    HuangLibo
        30
    HuangLibo  
       2016-11-17 00:15:43 +08:00
    @billlee 而大型项目恰有很多用的 C ,而且是顶级大型项目。
    billlee
        31
    billlee  
       2016-11-17 00:23:56 +08:00
    @HuangLibo 大多是没有 C++ 的时代遗留下来的
    SeanLin
        32
    SeanLin  
       2016-11-17 00:42:01 +08:00
    难道不是因为 python 的有很多第三方的包吗 (如 numpy , pandas....
    HuangLibo
        33
    HuangLibo  
       2016-11-17 00:49:26 +08:00
    @reus 你给的是开源产品源码,而非高可用的数据结构库,其实也可以自己把相关代码拿出来直接用,但是每个人都这么去搞只会增加这个世界的熵,,为什么 Github 上没有人去做这个很必要的工作呢
    reus
        34
    reus  
       2016-11-17 01:08:13 +08:00
    @HuangLibo glib 是基础库, apr 是基础库, glibc 是基础库,不是“产品”,是 library ,不是 product 。它们都实现了各种数据结构。直接用,直接链接就能用。而且流行的 linux 发行版都打包了这些库。
    这些 C 库早在 github 甚至 git 出现之前就出现了,拿来就能用,还需要什么额外工作?
    当然用 C 的话,大多也是做基础软件,例如 Python 解析器这类。一般都喜欢自己实现适合自身的数据结构,而不是用现成的。但并不是说没有现成的数据结构库给你用,不要太小看 C 的生态。
    hinkal
        35
    hinkal  
       2016-11-17 01:40:59 +08:00   ❤️ 2
    就知道会有人借机黑 Java...以代码写的简短来黑 Java 的,都太年轻太简单
    102400
        36
    102400  
       2016-11-17 03:35:32 +08:00
    @dtfm
    @doer233

    Ruby: ???

    v2ex = 'ebreredfdfhdlfhferdlhgfdnhe'
    v2ex.chars.map { |x| [x, v2ex.count(x)] }.to_h

    哼,有啥了不起的~
    hareandlion
        37
    hareandlion  
       2016-11-17 09:02:39 +08:00   ❤️ 1
    Python 的优势在于"据说程序员一生要写 600 万个花括号,谁先用完谁先走",这才对吧 :-D
    NaVient
        38
    NaVient  
       2016-11-17 09:17:42 +08:00
    @102400 Python 可以 Collections.counter(v2ex)
    WhyAreYouSoSad
        39
    WhyAreYouSoSad  
       2016-11-17 09:18:53 +08:00
    @hareandlion 233333333333333333333
    HuangLibo
        40
    HuangLibo  
       2016-11-17 09:28:28 +08:00
    @billlee 你这就太不了解 C 语言了,说的好像快被历史淘汰了一样, C 和 C++的使用场景不一样
    sun2920989
        41
    sun2920989  
       2016-11-17 09:30:20 +08:00   ❤️ 1
    论结构丰富,我只服 PHP 的数组
    spark
        42
    spark  
       2016-11-17 09:43:58 +08:00
    @dtfm 听君一席话,滚去玩 Python
    kimboqi
        43
    kimboqi  
       2016-11-17 10:09:22 +08:00
    numpy pandas 你会喜欢的
    liqiazero
        44
    liqiazero  
       2016-11-17 10:22:23 +08:00
    推荐看一下 《 Python 语言剖析》 陈儒写的, 08 年的书,满篇 C 语言的 Python 底层代码,各种数据结构的底层代码,读懂也就不会纠结于这个问题了。推荐看一下
    tairan2006
        45
    tairan2006  
       2016-11-17 11:13:35 +08:00
    论数据结构,应该是 C++的标准库里面最多吧。。如果加上 boost ,基本常见的都有了
    shell92
        46
    shell92  
       2016-11-17 11:25:10 +08:00
    嗯。。。。。。。
    est
        47
    est  
       2016-11-17 12:13:24 +08:00
    C 语言里能用一个 hash 已经是中级以上水平的了。

    用 C 实现一个 hmac 就得花很多功夫。不用第三方现成的库的话。
    masterqing
        48
    masterqing  
       2016-11-17 12:47:16 +08:00
    ruby 写的才像英语
    mooncakejs
        49
    mooncakejs  
       2016-11-17 12:47:49 +08:00
    @hareandlion py 作者的兼职是卖出 1000w 把尺子
    myid
        50
    myid  
       2016-11-17 14:34:38 +08:00
    就 7 楼的例子,来个 C++的实现, 2 行。怎么样?不逊于 Python 实现吧?行数一样, 2 行。自带数据结构,在 C++的 STL 里称为 map -- 支持范型,类型安全,效率和质量在工程上有口皆碑。


    std::map<char, int> v2ex;
    for (auto const& x : "ebreredfdfhdlfhferdlhgfdnhe") { ++v2ex[x]; }
    haoc
        51
    haoc  
       2016-11-17 14:45:05 +08:00
    python 数据结构真心没有 java 丰富。
    myid
        52
    myid  
       2016-11-17 15:26:42 +08:00
    @est 那么 C++呢? STL 和 boost 准备了巨量的东东等大家拿来用。。。
    myid
        53
    myid  
       2016-11-17 15:26:54 +08:00
    @est
    那么 C++呢? STL 和 boost 准备了巨量的东东等大家拿来用。。。
    102400
        54
    102400  
       2016-11-17 15:38:22 +08:00
    @NaVient

    算上 import 也是三行吧, Ruby 可以这样

    v2ex = 'ebreredfdfhdlfhferdlhgfdnhe'
    counters =-> s { s.chars.map { |c| [c, s.count(c)] }.to_h }
    counters.call v2ex
    wujunze
        55
    wujunze  
       2016-11-17 15:41:48 +08:00
    est
        56
    est  
       2016-11-17 17:26:16 +08:00
    @myid stl boost 算第三方库吧。 python 默默拿出 scipy sympy 装逼一发。

    符号计算。来比吧。等你们 link 完 python 版本说不定就上线了。
    littleshy
        57
    littleshy  
       2016-11-17 17:36:36 +08:00
    @102400
    @NaVient
    F#的 Seq.countBy
    wingyiu
        58
    wingyiu  
       2016-11-17 18:52:26 +08:00
    myid
        59
    myid  
       2016-11-17 20:59:22 +08:00 via iPhone
    @est STL 不是第三方库哦 所有不是很古董的 c++编译器都自带 STL 。 boost 特别一点 就不在这里展开了。要比生态环境 (例如数据结构实现) c/c++和 Python 一样强,甚至更强。 26 楼和 34 楼已给了解释和例子。
    pyufftj
        60
    pyufftj  
       2016-11-17 22:51:18 +08:00
    @chengluyu 总结的很好!
    pyufftj
        61
    pyufftj  
       2016-11-17 22:52:50 +08:00
    @dtfm 是的, python 的代码量少,而且看起来优雅。最主要的是写起来轻松,很容易就能将想法用代码表达出来
    billlee
        62
    billlee  
       2016-11-17 23:06:33 +08:00
    @HuangLibo 我是两个都很了解才会这样说,看过改过太多低质量的 C 代码了。 C 代码需要程序员的水平很高才能写好。 C++ 就算水平差一些,把它按照 MFC 风格或者 Java 风格来用,至少还比较容易看懂。
    est
        63
    est  
       2016-11-17 23:16:42 +08:00
    @myid 好吧。咋们来比赛解析 JSON 。 😂。

    特别是 key-value 的 type 不确定。比如取一个 key 的值 既可能是 int 又可能是 [int, float, string] 这种的。

    用 C++ 撸一个试试?
    tracymcladdy
        64
    tracymcladdy  
       2016-11-17 23:29:51 +08:00
    Miy4mori
        65
    Miy4mori  
       2016-11-17 23:43:58 +08:00 via Android
    Python 丰富?真涨见识……
    msg7086
        66
    msg7086  
       2016-11-18 00:41:38 +08:00
    Python 代码量太大了,为了可读性牺牲了简短小巧……
    lyz1990
        67
    lyz1990  
       2016-11-18 10:53:28 +08:00
    PHP :
    count_chars('ebreredfdfhdlfhferdlhgfdnhe',1)
    mingyun
        68
    mingyun  
       2016-11-26 20:47:40 +08:00
    @lyz1990 key 怎么成数字了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:51 · PVG 11:51 · LAX 19:51 · JFK 22:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.