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



我写了以下代码:

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)]

最新更新