【问题标题】:python dict comprehension with two ranges具有两个范围的python dict理解
【发布时间】:2013-09-18 07:34:04
【问题描述】:

我正在尝试生成一些代码,例如:

{1:7,2:8,3:9,4:10}

{i:j for i in range(1,5) for j in range(7,11)}

生产

{1: 10, 2: 10, 3: 10, 4: 10}

我该如何解决?

谢谢

【问题讨论】:

    标签: python dictionary list-comprehension


    【解决方案1】:

    使用zip

    >>> dict(zip(range(1,5), range(7,11)))
    {1: 7, 2: 8, 3: 9, 4: 10}
    

    使用dict comprehension

    >>> {k:v for k, v in zip(range(1,5), range(7,11))}
    {1: 7, 2: 8, 3: 9, 4: 10}
    
    >>> {x:x+6 for x in range(1,5)}
    {1: 7, 2: 8, 3: 9, 4: 10}
    

    为什么您的代码不起作用:

    您的代码类似于以下代码:

    ret = {}
    for i in range(1,5):
        for j in range(7,11):
            ret[i] = j
        # ret[i] = 10 is executed at last for every `i`.
    

    【讨论】:

    • 你可以去掉第二个的上限,改用itertools.count(7)...
    • @JonClements,Ashwini Chaudhary 的回答解决了这个问题。感谢您的评论。
    【解决方案2】:
    {i: j for i, j in zip(range(1, 5), range(7, 11))}
    

    【讨论】:

      【解决方案3】:

      使用zip(或itertools.izip)和itertools.count

      >>> from itertools import count, izip
      

      字典理解:

      >>> {k:v for k,v in izip(xrange(1,5), count(7))}
      {1: 7, 2: 8, 3: 9, 4: 10}
      

      dict():

      >>> dict(izip(xrange(1,5), count(7)))
      {1: 7, 2: 8, 3: 9, 4: 10}
      

      【讨论】:

        【解决方案4】:

        我会使用enumerate:

        >>> dict(enumerate(range(7, 11), 1))
        {1: 7, 2: 8, 3: 9, 4: 10}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-03-26
          • 2020-05-10
          • 2021-03-27
          • 2016-01-19
          • 2021-06-18
          • 1970-01-01
          • 2017-06-27
          相关资源
          最近更新 更多