都说 python 数据结构丰富,丰富在哪? - 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
doer233
V2EX    Python

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

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

    当人们谈论起 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     Solana     2643 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 13:45 PVG 21:45 LAX 06:45 JFK 09:45
    Do have faith in what you're doing.
    ubao 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