我写了以下代码:
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)]