我最近被介绍列出了一些理解,但是,我不确定我是否完全理解它们。
所以,我在文档和谷歌上做了一个快速搜索。
我找到了数据结构的docs部分。
https://docs.python.org/2/tutorial/datastructures.html
虽然这让我了解了它们的工作原理,但我想对它们的工作原理有一个更成熟的了解。
以下是文档中的一个示例:

>>>[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

如果我错了,请纠正我,但这就是我如何理解列表是如何评估的。
看起来列表理解是从左到右评估的。
这一理解引入了x和y。
然后根据列表定义X和Y,并根据列表中的位置和if条件进行计算。
由于x被指定为第一个变量,就像嵌套for循环的外部一样,它首先被调用,然后根据y的列表迭代。
if条件使得理解只产生与X遍历Y的列表不相似的对。
如果我的理解不正确,请纠正我。
我欢迎更复杂的理解例子。

最佳答案

嵌套列表理解没有什么神奇之处。我想你还没有看到他们的单纯!
这:

#      X           A                   B               C
a = [(x, y)   for x in [1,2,3]   for y in [3,1,4]   if x != y]

是简单的语法糖:
__tmp = []
for x in [1,2,3]:                   # A
    for y in [3,1,4]:               # B
        if x != y:                  # C
            __tmp.append((x, y))    # X

a = __tmp

所以你把for ... in ...部分重新组装成嵌套的for循环然后取ifs并将其嵌套在相应的for循环中;最后,取第一部分(在本例中为(x, y)),并嵌套在嵌套for结构的最深部分。
ifs出现在列表理解中的多个“阶段”时,这也很好,例如:
#      X         A                 B               C               D
a = [(x, y)   for x in [1,2,3]   if x >= 2   for y in [3,1,4]   if x != y]

将(desugars)转换为:
__tmp = []
for x in [1,2,3]:                     # A
    if x >= 2:                        # B
        for y in [3,1,4]:             # C
            if x != y:                # D
                __tmp.append((x, y))  # X

a = __tmp

所以再一次这和理解是完全一样的,部分之间穿插着冒号,而内部部分正好放在前面A B C D ...部分的顺序总是相同的,并且从未改变;只有X部分从后面移到前面。

10-07 13:31
查看更多