【问题标题】:convert for loop into dictionary comprehension将 for 循环转换为字典理解
【发布时间】:2017-06-14 00:25:51
【问题描述】:

我有一个运行良好的小程序。我试图强迫自己审查\分析我的代码,以试图让我的代码(和我自己)变得更好一点。

我想知道这一小部分代码是否:

temp2 = {}
for key in sorted(temp1.keys()):
    temp2[key] = temp1[key]

不能重写为字典理解。

主要由于我缺乏经验,我无法“转变” 这变成了理解。

循环所做的只是获取字典temp1,对其进行排序并将新排序的key:value 对放入temp2

正如我上面所说,整个事情都是这样,但我正在努力学习 找出我可以改进的模式。

【问题讨论】:

    标签: python dictionary python-3.6 dictionary-comprehension


    【解决方案1】:

    直接将其翻译成字典理解很容易:

    temp2 = {key: value for key, value in sorted(temp1.items())}
    

    如果您不想将value 用作决胜局(如果键相等),您还可以提供key,这样您就只能根据key 进行排序:

    temp2 = {key: value for key, value in sorted(temp1.items(), key=lambda x: x[0])}
    

    尽管字典在 python-3.6 中是“有序的”,但这并不意味着你应该依赖它(有序性正式只是一个副作用!)。最好使用OrderedDict 并确保安全:

    from collections import OrderedDict
    temp2 = OrderedDict([(key, value) for key, value in sorted(temp1.items(), key=lambda x: x[0])])
    

    【讨论】:

    • 由于您的第二个答案完美运行,我想知道第三个选项(涉及 OrderedDict)带来了什么。什么时候选项#3 是更合适的选择?谢谢。
    • @MarkS 啊,这有点复杂。字典本身是无序的,因此根据定义对字典进行排序注定会失败。但从 3.6 开始,字典现在已有序,但正式而言,这只是一个“实施细节”,随时可能发生变化。因此,如果您希望它与不同的 Python 版本一起使用或想要“安全地玩”,您绝对必须使用OrderedDict。我主要是添加它,因为如果您需要订购它,首选OrderedDict 而不是dict 仍然是最佳实践。 :)
    猜你喜欢
    • 2020-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    相关资源
    最近更新 更多