将嵌套的 for 循环转换为列表 comp 并从生成的字典列表中过滤完美的正方形

Convert nested for-loop to list comp and filter perfect squares from resultant list of dicts

我写了下面的代码:

a_list = []

for x in range(5):
    a_list.append(dict())
    for y in range(5):
        if (x != 0 and y != 0) and (x * x != x * y):
            a_list[-1][y] = x * y

结果是:

[{}, {2: 2, 3: 3, 4: 4}, {1: 2, 3: 6, 4: 8}, {1: 3, 2: 6, 4: 12}, {1: 4, 2: 8, 3: 12}]

但是,我必须使用列表理解来获得相同的结果。请问我该怎么做?

以下嵌套理解将起作用:

[{y: x*y for y in range(5) if y and x*x != x*y} for x in range(5)]
# [{}, {2: 2, 3: 3, 4: 4}, {1: 2, 3: 6, 4: 8}, {1: 3, 2: 6, 4: 12}, {1: 4, 2: 8, 3: 12}]

内部字典理解的条件有点简化,因为 x*x != x*y 已经暗示了 x != 0

你可以这样写:

a_list = [{y: x * y for y in range(5) if (x and y) and (x * x != x * y)}
          for x in range(5)]    

# [{}, {2: 2, 3: 3, 4: 4}, {1: 2, 3: 6, 4: 8}, {1: 3, 2: 6, 4: 12}, {1: 4, 2: 8, 3: 12}]

有时 list comprehension 比嵌套的 for loops 可读性更差或更复杂。

你的if语句可以简化一些:

[{y: x*y for y in range(1, 5) if 0 != x != y} for x in range(5)]

给出:

[{}, {2: 2, 3: 3, 4: 4}, {1: 2, 3: 6, 4: 8}, {1: 3, 2: 6, 4: 12}, {1: 4, 2: 8, 3: 12}]

注意内部范围不需要零索引。

这里已经有一些非常好的答案。这是我的尝试:

a_list = [dict() for x in range(5)]
[[a_list[x].update({y:x * y}) for y in range(5) if (x != 0 and y != 0) and (x * x != x * y)] for x in range(5)]