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

强迫症已被 python 的 dictionary 逼疯

  •  
  •   Cassandra · 2016-01-23 00:49:06 +08:00 · 7978 次点击
    这是一个创建于 3018 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本来不想上 V2 来问的啊,可是一想到这问题我就要疯啊啊啊啊
    强迫症已撞死在墙上{>~<}
    有没有可能 按照我输入的顺序 print 一个 dictionary 的 key

    例如说,我现在有 有一个 dictonary 输入为
    studentGrades = {'Steven':90, 'Chole':70,'Bob':100}
    print(studentGrades)

    如果不作任何改变,这个 print 的 result 在某种程度上是 random
    可是我想按照我输入的顺序来了,也就是 output 从 Steven 到 Chole 到 Bob

    我现在只能做到按照字母顺序来排列,也就是 Bob, Chole, Steven

    我试过什么 orderedDict 什么的,但是不 work ,我也不知道是不是我写错了

    不改过来总觉得作业没有写完,都不想交了%>_<%

    求大家帮帮忙,求轻喷
    顺便说一句是 python3.5

    第 1 条附言  ·  2016-01-23 01:34:48 +08:00
    先谢谢大家把我的强迫症治好了,会感谢大家的 Y^o^Y

    另更正一个单词拼写错误:
    应把“例如说,我现在有 有一个 dictonary 输入为” 中的 “ dictonary ” 改为 “ dictionary ”
    上课的时候打的,输入的时候可能还有其他错误,希望大家不要介意

    强迫症真的是病得治,这不都影响到上课了+_+
    第 2 条附言  ·  2016-01-23 01:36:48 +08:00
    去睡个回笼觉,大家的回复我就晚点在看咯~~
    么么哒~~~
    84 条回复    2016-01-26 22:45:33 +08:00
    ipconfiger
        1
    ipconfiger  
       2016-01-23 00:51:56 +08:00   ❤️ 1
    数据结构本身就决定了没可能啊, 好好学学数据结构先

    绕弯能实现, 蛋痛
    fy
        2
    fy  
       2016-01-23 00:54:36 +08:00   ❤️ 1
    我也觉的这是一个不好的地方,有序字典不是不 work ,是你先创建了一个标准字典,然后标准字典转换成了无序字典。

    换一种创建方式就好了
    OrderedDict((('c', 3), ('a',1), ('b',2)))

    我觉得这确实是个问题
    zeyexe
        3
    zeyexe  
       2016-01-23 00:55:19 +08:00   ❤️ 1
    OrderedDict 是可以实现顺序输出的,也许你的用法有误。
    Cassandra
        5
    Cassandra  
    OP
       2016-01-23 00:58:12 +08:00
    @ipconfiger 完全没可能嘛?你说的绕弯是什么样的方法呢?老师布置作业的时候都还没讲怎么创建 dictionary 呢~然而刚讲完创建作业就要教了 T^T
    yelite
        6
    yelite  
       2016-01-23 00:59:13 +08:00   ❤️ 1
    OrderedDict 用 tuple list 初始化就可以了,
    OrderedDict({'Steven':90, 'Chole':70,'Bob':100}) 这样肯定是不行的
    Cassandra
        7
    Cassandra  
    OP
       2016-01-23 01:00:32 +08:00
    @fy studentGrades = OrderedDict((('Steven':90), ('Chole':70),('Bob':100) 这样伐?原谅我悟性是在太差
    Cassandra
        8
    Cassandra  
    OP
       2016-01-23 01:01:34 +08:00
    @zeyexe
    @yelite
    求大神们教正确使用方法
    Cassandra
        9
    Cassandra  
    OP
       2016-01-23 01:02:48 +08:00
    @leavic 感谢,我再试试
    xuboying
        10
    xuboying  
       2016-01-23 01:07:29 +08:00   ❤️ 1
    2.7 语法,使用前把全角空格替换成半角空格

    #!python

    def myorder(key):
       return ['Steven','Bob','Chole'].index(key)

    studentGrades = {'Steven':90, 'Chole':70,'Bob':100}
    for k in sorted(studentGrades.keys(),key=myorder):
       print "%s ===> %d" % (k,studentGrades[k])
    gccplus
        11
    gccplus  
       2016-01-23 01:09:32 +08:00   ❤️ 1
    https://pymotw.com/2/collections/ordereddict.html

    In [5]: import collections
    In [6]: d = collections.OrderedDict()
    In [7]: d['Steven']=90
    In [8]: d['Chole']=70
    In [9]: d['Bob']=100
    fy
        12
    fy  
       2016-01-23 01:09:45 +08:00
    @Cassandra
    这个姿势: student_grades = OrderedDict((('Steven',90), ('Chole',70),('Bob', 100)))

    另外 Python 不用驼峰法则!命名是中间隔下划线的,函数和类方法都是这样的!
    Cassandra
        13
    Cassandra  
    OP
       2016-01-23 01:10:17 +08:00
    @xuboying 这个在 3.5 上也可以的嘛?当时找解决方案的时候看到了,但说是 2.7 我就没试
    xuboying
        14
    xuboying  
       2016-01-23 01:11:13 +08:00 via Android
    @Cassandra 我这没 3 ,你简单改改就可以用了
    xuboying
        15
    xuboying  
       2016-01-23 01:12:32 +08:00 via Android
    @fy 驼峰很好识别的
    Cassandra
        16
    Cassandra  
    OP
       2016-01-23 01:13:27 +08:00
    @fy 谢谢!只是初学者这些我都不知道啊,我都不知道这种命名方式叫驼峰法则。。。这是老师硬性规定的不能怪我呀。对于目前的我而言,我能知道他是啥就可以了,其他都不重要~~~嘤嘤嘤
    Cassandra
        17
    Cassandra  
    OP
       2016-01-23 01:14:57 +08:00
    @gccplus 可是我的实际运用有好多 key 这么写好累,有没有更简便的方法呢?
    fy
        18
    fy  
       2016-01-23 01:22:49 +08:00
    @Cassandra 可以啊 我这里就是 3 。实际输入数据的话,楼主你要看输入的方式了,比如源文件是一行 key 一行 value ,或者源文件是 csv 格式,源文件是 json 格式等等……

    如果数据比较少打算直接写在代码里,简单的 KV 数据基本上打开编辑器一条正则替换就搞定啦!

    老师规定的话就按老师的走了。
    RqPS6rhmP3Nyn3Tm
        19
    RqPS6rhmP3Nyn3Tm  
       2016-01-23 01:34:51 +08:00
    懒得看回复了…我觉得用一个 list 套就可以了啊
    RqPS6rhmP3Nyn3Tm
        20
    RqPS6rhmP3Nyn3Tm  
       2016-01-23 01:35:36 +08:00
    原来楼主有老师啊… Python 我感觉还是自学效率比较高
    Cassandra
        21
    Cassandra  
    OP
       2016-01-23 01:35:52 +08:00
    @fy 好的好的谢谢啦~~已经改好了
    Cassandra
        22
    Cassandra  
    OP
       2016-01-23 01:39:56 +08:00
    @BXIA 因为是学校的课程嘛~~之前自学 2.7 因为不是电脑专业,也就因为其他的事情耽搁了好久。现在刚好选修课不够就捡起来学呗~~~

    至于 list ,我主要觉得调用太麻烦, dictionary 这种 key-value 对定的方式我觉得比较简单啦~~(其实就是懒=_=
    zeroten
        23
    zeroten  
       2016-01-23 01:40:26 +08:00 via Android
    好奇哪个学校教 Python ?
    Cassandra
        24
    Cassandra  
    OP
       2016-01-23 01:42:45 +08:00
    @zeroten 不是国内的学校啦~~这个只是作为电脑专业的基础课程啦~~~像我这种非专业的人就只能学学这种基础的东西,算法什么都接触不到呢⊙﹏⊙
    RqPS6rhmP3Nyn3Tm
        25
    RqPS6rhmP3Nyn3Tm  
       2016-01-23 01:42:59 +08:00
    @Cassandra 最近写爬虫我也在折腾 Python …同好奇哪个学校会教?
    Cassandra
        26
    Cassandra  
    OP
       2016-01-23 01:46:28 +08:00
    @BXIA 回复看 24 楼,国内都教什么呢?
    RqPS6rhmP3Nyn3Tm
        27
    RqPS6rhmP3Nyn3Tm  
       2016-01-23 01:55:15 +08:00 via iPad
    @Cassandra 不知道……即将出国党……
    RqPS6rhmP3Nyn3Tm
        28
    RqPS6rhmP3Nyn3Tm  
       2016-01-23 01:57:05 +08:00 via iPad
    @Cassandra 是北美吗?似乎那边教 Python 的比较多啊
    Cassandra
        29
    Cassandra  
    OP
       2016-01-23 01:57:39 +08:00
    @BXIA 好吧,加油哦
    20015jjw
        30
    20015jjw  
       2016-01-23 04:47:14 +08:00
    @Cassandra 根据这个时间线... lz 你是三学期的学校?
    Cassandra
        31
    Cassandra  
    OP
       2016-01-23 06:01:16 +08:00
    @BXIA 是在北美
    Cassandra
        32
    Cassandra  
    OP
       2016-01-23 06:02:41 +08:00
    @20015jjw 我不太清楚国内的设置,但是北美的学校都这个时间啊,欧洲也差不多吧
    SharkIng
        33
    SharkIng  
       2016-01-23 06:42:44 +08:00
    @BXIA 北美主要是用 Python 的比较多,所以教的也多,但是也不是所有学校都是这样,另一个朋友的学校是学 C ,四年全部是 C 和概念课,根本不知道 Python 和 Java 是什么,好奇怪...


    @20015jjw 这个和三学期有什么关系,哈哈


    @fy 驼峰不驼峰好像没有硬性规定吧?只是一个习惯问题,有些人喜欢驼峰有些人不喜欢而已....
    Perry
        34
    Perry  
       2016-01-23 07:00:33 +08:00
    题外话,学完 python 建议学下 Java 的 Data Structure
    yelite
        35
    yelite  
       2016-01-23 08:12:25 +08:00
    情侣头像好赞,和以前的画风不一样了
    florije
        37
    florije  
       2016-01-23 08:33:35 +08:00   ❤️ 1
    按照你输入的顺序来输出的话最简单的就是 OrderedDict 了的,他能记录你放入的顺序。
    from collections import OrderedDict

    sap_dict = OrderedDict()
    sap_dict['A'] = 1
    sap_dict['B'] = 2
    sap_dict['C'] = 3

    print(sap_dict)
    for key, value in sap_dict.items():
    print(key, value)

    result :
    OrderedDict([('A', 1), ('B', 2), ('C', 3)])
    A 1
    B 2
    C 3
    florije
        38
    florije  
       2016-01-23 08:34:25 +08:00
    不过话说你的程序猿小伙伴没能帮你解决么~
    xiamingchong
        39
    xiamingchong  
       2016-01-23 09:27:09 +08:00
    换用世界上最好的语言,就不会遇到这种问题
    fy
        40
    fy  
       2016-01-23 11:09:04 +08:00
    @SharkIng PEP8 ,用的最普遍的编码标准。当然 java 也可以不用驼峰,但谁没事这么做呢?
    SharkIng
        41
    SharkIng  
       2016-01-23 11:50:47 +08:00
    @fy https://www.python.org/dev/peps/pep-0008/#descriptive-naming-styles 这里不是也提到了驼峰?感觉驼峰在命名规则里面还是很常见的。不过的确 Python 的程序很多都是_A_B 这样的命名,不过总的来说也不能完全说是错误的,最多只是习惯不符合标准罢了
    mashpolo
        42
    mashpolo  
       2016-01-23 12:39:03 +08:00
    json.dumps(studentGrades)
    转成 json 数据打印出来就好了
    Executable
        43
    Executable  
       2016-01-23 13:00:46 +08:00
    @zeroten 北京市某知名大学
    Cassandra
        44
    Cassandra  
    OP
       2016-01-23 13:05:50 +08:00
    @Perry 好的谢谢
    Cassandra
        45
    Cassandra  
    OP
       2016-01-23 13:06:08 +08:00
    @yelite 以前什么样
    Cassandra
        46
    Cassandra  
    OP
       2016-01-23 13:06:34 +08:00
    @florije 他那个时候睡觉呢
    Cassandra
        47
    Cassandra  
    OP
       2016-01-23 13:07:09 +08:00
    @xiamingchong 我也想啊,这门课是学 python
    Cassandra
        48
    Cassandra  
    OP
       2016-01-23 13:07:48 +08:00
    @mashpolo 没学过,下次知道了
    Cassandra
        49
    Cassandra  
    OP
       2016-01-23 13:08:14 +08:00
    @Executable 都说在国外的初学者了,莫名被黑的赶脚
    yelite
        50
    yelite  
       2016-01-23 13:19:05 +08:00
    @Cassandra 记得是绿色背景,然后手里拿一个缩小版的对方,看上去挺有爱的
    TheCure
        51
    TheCure  
       2016-01-23 13:19:20 +08:00
    orderDict 可以实现
    但是 orderDict 在某些情况下不好用的话
    我会用一个 list 维护顺序
    chrishine
        52
    chrishine  
       2016-01-23 14:20:50 +08:00
    golang map value is unaddressable
    zhanzhan
        53
    zhanzhan  
       2016-01-23 14:31:25 +08:00 via iPhone
    悄悄岔一下 晚点再看
    RqPS6rhmP3Nyn3Tm
        54
    RqPS6rhmP3Nyn3Tm  
       2016-01-23 14:42:19 +08:00
    @SharkIng 的确, Python 驼峰似乎用的不多,较多的还是下划线
    我本来是驼峰的,被硬生生改过来了
    tairan2006
        55
    tairan2006  
       2016-01-23 15:22:57 +08:00
    也是醉了…用哈希表初始化红黑树。。

    python 只有类名是驼峰的,其他的基本全是下划线,参考 PEP8
    ethego
        56
    ethego  
       2016-01-23 15:26:01 +08:00
    @SharkIng pep8 不建议使用驼峰做变量和函数名
    chuan
        57
    chuan  
       2016-01-23 15:46:59 +08:00
    字典要有序的思想是不是从 C++那里来的啊, C++里的 map 默认是有序的(一般是二叉树实现), unorderd_map 是无序的( hash 表实现),在直接读取上, unorderd_map 应该更快。 python 里默认 dict 是无序的,不过 unorderd_dict 依然还是 hash 表实现,读取速度上表现应该相当,其他方面的损失我就不太清楚了。
    chuan
        58
    chuan  
       2016-01-23 15:53:52 +08:00
    不好意思,上面一条的 python unorderd_dict 写错了,是 collections.OrderdDict ,囧
    chuan
        59
    chuan  
       2016-01-23 15:55:25 +08:00
    又拼错了,是 collections.OrderedDict 。。。。忽略我。。。。
    kqz901002
        60
    kqz901002  
       2016-01-23 15:57:11 +08:00
    @fy 没有看到哪个文档说 python 不用驼峰法则的,我觉得驼峰也没什么
    slfmessi
        61
    slfmessi  
       2016-01-23 17:44:36 +08:00
    @kqz901002 [PEP8]( https://www.python.org/dev/peps/pep-0008/#naming-conventions) 中有 Python 的命名约定,虽然我个人也更喜欢驼峰一点
    slfmessi
        62
    slfmessi  
       2016-01-23 17:47:01 +08:00
    @slfmessi 失败了= =
    kqz901002
        63
    kqz901002  
       2016-01-23 17:52:08 +08:00
    @slfmessi 我就是说的这个文档啊,这个文档没有说不建议驼峰命名啊, OrderedDict 本身就是驼峰命名, studentGrades 是首字母小写的驼峰命名法, pep8 的建议是有统一的,易读的命名规则
    fy
        64
    fy  
       2016-01-23 18:04:05 +08:00
    @kqz901002 大哥 下划线命名是变量名和函数名啊, OrderedDict 是驼峰没错,但这是类名啊!

    我之前也说了公司或者老师要求的编码规范最大。除此之外, Python 大多数库通行的规则就是小写下划线。当然有些著名的库不是,我们都知道那些库很多年头了或者本身就是从 java 复刻的。

    通行不通行这也不是我钦定的,我举个例子

    def helloWorld():
    pass

    在 PyCharm 下:
    Function name should be lowercase

    在 Vim 插件 ycm 下(用的是 jedi 还是 pylint 我忘了)
    [invalid-name] Invalid function name "helloWorld"

    我再重复一次,当前要求的编码规范最大。而 Python 最通行的函数名变量名命名规则是小写下划线。
    Executable
        65
    Executable  
       2016-01-23 18:35:35 +08:00
    @Cassandra 讲真啊,我北航的同学,非计算机类,学 python ,还要做 0-1 背包
    Cassandra
        66
    Cassandra  
    OP
       2016-01-23 22:10:36 +08:00
    @yelite 哇塞还有人知道呢
    ethego
        67
    ethego  
       2016-01-23 22:19:05 +08:00
    @kqz901002 建议你再好好读读 pep8 ,另外 OrderedDict 是类
    Cassandra
        68
    Cassandra  
    OP
       2016-01-23 22:19:24 +08:00
    @chuan 恩恩对啊,因为写的时候是按照顺序来的,所以 print 出来是无序的看的我很烦恼
    Cassandra
        69
    Cassandra  
    OP
       2016-01-23 22:25:12 +08:00
    @tairan2006
    @ethego
    @kqz901002
    @fy
    @BXIA


    看你们争论命名方式很有意思。但是 python 也只是建议下划线的命名方式,并不是说驼峰就一定不可以。尽管统一的命名方式在团队合作 或者与别人共享代码的时候读起来比较方便,但是个人也有个人的习惯,我也不觉得非要强制成一个样。

    PS :我觉得下划线破坏了单词的美感
    Cassandra
        70
    Cassandra  
    OP
       2016-01-23 22:26:07 +08:00
    @callofmx 我主要觉得 list 调用数据有点麻烦,懒得要死
    ethego
        71
    ethego  
       2016-01-23 23:37:18 +08:00
    @Cassandra 自己写给自己看就算了,但是一旦要发布出去供别人阅读、或者进行团队协作,会给其他人造成很大的困扰,因为大家默认把驼峰看成类名。如果在公司这么写,我想同事对这个人的印象会不太好,因为无形之间增加了很多沟通的成本。很多时候, pep8 的“建议”就是强制性的。
    ethego
        72
    ethego  
       2016-01-23 23:40:08 +08:00
    @Cassandra 一般公司或者组织也会有编码规范,通常就是 pep8 ,代码很大程度上其实不是拿来执行的,是供人阅读的。
    Cassandra
        73
    Cassandra  
    OP
       2016-01-24 01:10:42 +08:00
    @ethego 我只是不愿意方便别人难为自己,这件事情是没有道理的
    ethego
        74
    ethego  
       2016-01-24 01:20:13 +08:00
    @Cassandra 可以默默地祝福自己永远不需要商业编程。。
    ethego
        75
    ethego  
       2016-01-24 01:22:53 +08:00
    @Cassandra 那你写 html 怎么办?标签只允许-连接,驼峰是无效的因为不区分大小写
    Cassandra
        76
    Cassandra  
    OP
       2016-01-24 01:44:59 +08:00
    @ethego 只能用的就用只能的呗, html 写的很习惯啊。我反正又不是电脑专业,学这些只是好玩
    20015jjw
        77
    20015jjw  
       2016-01-24 02:08:45 +08:00
    @Cassandra 不是唉 我在当助教 我们这课才开始一周 dict 要 4-5 周这样
    20015jjw
        78
    20015jjw  
       2016-01-24 02:12:24 +08:00
    @SharkIng 就是觉得开学好早啊这么快教到 dict 啦
    Cassandra
        79
    Cassandra  
    OP
       2016-01-24 03:34:19 +08:00
    @20015jjw 我们要步入第三周了。
    kqz901002
        80
    kqz901002  
       2016-01-24 12:19:04 +08:00
    @fy
    ===
    @Cassandra
    这个姿势: student_grades = OrderedDict((('Steven',90), ('Chole',70),('Bob', 100)))

    另外 Python 不用驼峰法则!命名是中间隔下划线的,函数和类方法都是这样的!
    ===
    这是你的原话
    fy
        81
    fy  
       2016-01-24 14:32:17 +08:00
    @kqz901002 还撕,没完了是吧
    kqz901002
        82
    kqz901002  
       2016-01-24 22:42:12 +08:00
    @fy oh, 我好像看错了, sorry
    LokiSharp
        83
    LokiSharp  
       2016-01-25 15:24:31 +08:00   ❤️ 1
    处理字典我会这样加一段

    t = list()
    for key,val in dictionary
    t.append((val,key))
    t.sort(reverse=True)
    kkzxak47
        84
    kkzxak47  
       2016-01-26 22:45:33 +08:00   ❤️ 1
    不想用 OrderedDict 的话,那就配合一个 list 或者 tuple 来用好了。

    比如 lst = ['alice', 'bob', 'clare']
    d = {'clare': 100, 'bob': 90, 'alice': 80}
    for key in lst:
    print(key, d[key])

    ('alice', 80)
    ('bob', 90)
    ('clare', 100)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2654 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 15:38 · PVG 23:38 · LAX 08:38 · JFK 11:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.