当我通过可视化工具运行时,它只修改了2d列表中的第一个元素。如何使它在整个列表中运行。
def make_even(xss):
for i in range(len(xss)):
for j in range(len(xss)):
if xss[i][j] % 2!= 0:
xss[i][j] += 3
return xss
xss = [[1,2,3],[],[4,5]]
make_even(xss)
print(xss)
答案 0 :(得分:0)
首先,您需要更正代码中的缩进:
def make_even(xss):
for i in range(len(xss)):
for j in range(len(xss)):
if xss[i][j] % 2!= 0:
xss[i][j] += 3
return xss
但是,因为你的循环都使用len(xss)
,所以它们需要一个包含3个元素的3个列表的数组。如果您希望每个列表都包含可变数量的元素,则应该执行此操作:
def make_even(xss):
for i in range(len(xss)):
for j in range(len(xss[i])):
if xss[i][j] % 2!= 0:
xss[i][j] += 3
return xss
返回:[[4, 2, 6], [], [4, 8]]
但是,我会做出两个明显的改变:
if xss[i][j] % 2 == 1
,因为它更具可读性。此外,这在一行中完全可行(任何行都可以):
# List comprehensions only
xss = [[(x + 3 if x % 2 == 1 else x) for x in row] for row in xss]
# map and lamdbas (returns lists)
xss = list(map(lambda row: list(map((lambda x: x + 3 if x % 2 == 1 else x),row)), xss))
# map and lamdbas (returns iterables)
xss = map(lambda row: map((lambda x: x + 3 if x % 2 == 1 else x),row), xss)
虽然我个人认为,列表理解是最容易阅读的。