【问题标题】:Correct syntax for nested list or set comprehension嵌套列表或集合理解的正确语法
【发布时间】:2012-10-05 04:44:12
【问题描述】:

想象一下这个物体:

my_obj = {
    'Episodes' : [
        {'Tags' : ['one','two','three']},
        {'Tags' : ['three','four','five']}
            ]
        }

我想创建一组标签:

tags = set(tag for tag in e['Tags'] for e in my_obj['Episodes'])

但是,它不起作用,因为未定义 e。我该怎么做??

【问题讨论】:

  • this other question,它也处理嵌套列表理解语法
  • 另一个问题比我的问题长约 50 倍,也更复杂。如果我正在寻找这个问题的答案,我知道我宁愿消化哪一个。没有不尊重!

标签: python set list-comprehension


【解决方案1】:
tags = set(tag  for e in my_obj['Episodes'] for tag in e['Tags'])

你需要改变顺序,先得到e... :)

【讨论】:

    【解决方案2】:

    我用来避免被这些嵌套推导混淆的技巧是按照循环在推导中出现的顺序展开循环

    所以在你的例子中,你有一个genex:

    tag for tag in e['Tags'] for e in my_obj['Episodes']

    你可以像这样在精神上扩展成双循环:

    for tag in e['Tags']:
      for e in my_obj['Episodes']:
        yield tag
    

    现在有了这个结构,你可以很清楚地看到你的错误在哪里,e 是未定义的,并看到它应该是:

    for e in my_obj['Episodes']:
      for tag in e['Tags']:
        yield tag 
    

    折叠回嵌套理解

    tag for e in my_obj['Episodes'] for tag in e['Tags']

    正如您已经从之前的答案中看到的那样。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2019-08-26
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多