【问题标题】:Python nested dict comprehension with sets带有集合的 Python 嵌套字典理解
【发布时间】:2011-01-09 11:45:54
【问题描述】:

有人可以解释如何进行嵌套的字典推导吗?

>> l = [set([1, 2, 3]), set([4, 5, 6])]
>> j = dict((a, i) for a in s for i, s in enumerate(l))
>> NameError: name 's' is not defined

我会喜欢的:

>> j
>> {1:0, 2:0, 3:0, 4: 1, 5: 1, 6: 1}

我刚刚向previous question 询问了一个更简单的 dict 理解,其中生成器函数中的括号被减少了。怎么理解最左边的s不被识别?

【问题讨论】:

    标签: python dictionary list-comprehension


    【解决方案1】:

    只需颠倒两个循环的顺序即可:

    j = dict((a, i) for i, s in enumerate(l) for a in s)
    

    【讨论】:

    • 这行得通。但是,我在手册 (docs.python.org/tutorial/datastructures.html) 中读到“必须特别注意嵌套列表推导:为避免在嵌套列表推导时感到忧虑,请从右到左阅读。”为什么这不适用?
    • @Jasie 因为我们在这里所做的不是嵌套列表理解。嵌套列表理解类似于[ [i*j for j in range(3)] for i in range(3)]。我们这里使用的工具根本不是列表推导,它是一个生成器表达式。
    • 来自 PEP 202 (python.org/dev/peps/pep-0202),根据 BDFL:The form [... for x... for y...] nests, with the last index varying fastest, just like nested for loops. 重点不是我们使用的是哪种类型的表达式,而是列表的嵌套循环语法理解。
    • 我明白了,感谢您的解释 + 链接,@Satoru.Logic & @katriealex。
    猜你喜欢
    • 2015-04-11
    • 2017-03-09
    • 1970-01-01
    • 2013-07-28
    • 2011-06-06
    • 2021-12-22
    • 2013-09-19
    • 1970-01-01
    相关资源
    最近更新 更多