【问题标题】:"Name * not defined" in nested python comprehension嵌套python理解中的“名称*未定义”
【发布时间】:2016-04-02 06:15:59
【问题描述】:

我已经在这种形式的字典中收集了信息:

dico = {
        'key1': ('el1', 'el2', 'el3'),
        'key2': ('el4',),
        'key3': ('el5', 'el6'),
        }

我希望以这样的方式迭代它,这样会产生:

>>> for i in gen:
...    print(i)
('key1', 'el1')
('key1', 'el2')
('key1', 'el3')
('key2', 'el4')
('key3', 'el5')
('key3', 'el6')

这就是我构建gen的方法:

gen = ((key, value) for value in values for key, values in dico.items())

但这会引发NameError

NameError: name 'values' is not defined

怎么了?我该怎么办?

【问题讨论】:

    标签: python python-3.x dictionary iterator generator


    【解决方案1】:

    颠倒顺序以便名称解析:

    gen = ((key, value) for (key, values) in dico.items() for value in values)
    

    for 循环的顺序应该和你写的一样:

    for key, values in dico.items():
        for value in values:
            yield key, value
    

    【讨论】:

    • 原来如此!干杯:)
    【解决方案2】:

    您需要按照嵌套顺序从左到右列出循环。你交换了那个顺序。

    这行得通:

    gen = ((key, value) for key, values in dico.items() for value in values)
    

    这与您将这些循环嵌套在生成器函数中的方式相对应:

    for key, values in dico.items():
        for value in values:
            yield (key, value)
    

    【讨论】:

      【解决方案3】:
      You have to reverse the order of gen generation code.
      
      dico = {
              'key1': ('el1', 'el2', 'el3'),
              'key2': ('el4',),
              'key3': ('el5', 'el6'),
              }
      gen = ((key, value) for (key, values) in dico.items() for value in values)
      for i in gen:
          print(i)
      
      >>> ================================ RESTART ================================
      >>> 
      ('key1', 'el1')
      ('key1', 'el2')
      ('key1', 'el3')
      ('key2', 'el4')
      ('key3', 'el5')
      ('key3', 'el6')
      >>> 
      
      How bellow code is eveluated:
      gen = ((key, value) for (key, values) in dico.items() for value in values)
      
      step 1: for (key, values) in dico.items()
      step 2: values of step 1 will be input for bellow code:
              for value in values
      step 3: then for every value it will store the key, value pair in gen
      dictionary.
      

      【讨论】:

        猜你喜欢
        • 2013-11-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 2021-06-18
        相关资源
        最近更新 更多