【问题标题】:Are these two python for-loops the same thing?这两个python for循环是一回事吗?
【发布时间】:2015-08-02 01:33:37
【问题描述】:

我正在浏览一个视频教程,但我对 dict() 命令中的 for 循环感到措手不及。我很难在 dict() 命令上搜索东西(一直在字典而不是命令上获取定义)所以我现在假设我可以在命令中添加 for 循环。

在他们使用的视频中

dict((m[:3].lower(),m) for m in months)

所以我很好奇这是否与

for m in months:
    variable = dict((m[:3].lower(),m))

这是供参考的视频 https://youtu.be/a2sLiEgBl9k?t=1m17s

【问题讨论】:

    标签: python loops for-loop dictionary command


    【解决方案1】:

    此表达式正在使用生成器表达式创建dict

    d = dict((m[:3].lower(),m) for m in months)
    

    等价于

    d = dict()
    for m in months:
        d[m[:3].lower()] = m
    

    你的第二个循环没有做同样的事情。您每个月都在迭代,然后创建一个带有单个条目的dict 并将其分配给variable。每次迭代都会覆盖此变量。

    从查看代码,他们正在尝试制作这样一个字典:

    {'jan': 'January',
     'feb': 'February',
     'mar': 'March',
     ...
    }
    

    【讨论】:

    • 这就是他们填充字典的方式。 m[:3].lower() 是键(如'jan'),m 是值(如'January')。所以要设置一个字典值,你可以使用语法d[key] = value
    • 啊,我明白了。感谢您澄清这一点。
    【解决方案2】:

    不,那不一样。

    您的版本每次迭代都会创建一个新的字典对象,只有一个键和值。视频中的版本使用一系列键值对创建 一个 字典对象。

    视频中的版本相当于:

    d = {}
    for m in months:
        d[m[:3].lower()] = m
    

    但是使用generator expression 在循环中生成键值对(作为元组)。 dict() 对象获取每个这样的对并将它们添加到正在构造的字典中。

    在 Python 2.7 和更新版本中也可以使用dictionary comprehension

    {m[:3].lower(): m for m in months}
    

    最终结果是一个以每个月的前三个字母(小写)为key的字典:

    >>> import calendar
    >>> months = calendar.month_name[1:]
    >>> {m[:3].lower(): m for m in months}
    {'mar': 'March', 'feb': 'February', 'aug': 'August', 'sep': 'September', 'apr': 'April', 'jun': 'June', 'jul': 'July', 'jan': 'January', 'may': 'May', 'nov': 'November', 'dec': 'December', 'oct': 'October'}
    >>> pprint(_)
    {'apr': 'April',
     'aug': 'August',
     'dec': 'December',
     'feb': 'February',
     'jan': 'January',
     'jul': 'July',
     'jun': 'June',
     'mar': 'March',
     'may': 'May',
     'nov': 'November',
     'oct': 'October',
     'sep': 'September'}
    

    【讨论】:

      猜你喜欢
      • 2013-04-09
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多