强迫症已被 python 的 dictionary 逼疯 - 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
Cassandra
V2EX    Python

强迫症已被 python 的 dictionary 逼疯

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

    本来不想上 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     Solana     2185 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 16:09 PVG 00:09 LAX 09:09 JFK 12:09
    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