修改2d列表中的所有整数,使它们均为

时间:2017-05-09 06:49:05

标签: python-3.x

当我通过可视化工具运行时,它只修改了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)

1 个答案:

答案 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]]

但是,我会做出两个明显的改变:

  1. 您的if语句应为if xss[i][j] % 2 == 1,因为它更具可读性。
  2. 您甚至可以通过添加1来创建一个数字。(如果您的规格需要3,那很好)。
  3. 此外,这在一行中完全可行(任何行都可以):

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

    虽然我个人认为,列表理解是最容易阅读的。