Python列表理解缺少信息

时间:2020-05-13 09:26:41

标签: python list

我正在尝试将以下代码实现为列表理解:

def incrementValues(m): 
    for i in range(len(m)):
        for ii in range(len(m[i])):
            if m[i][ii] % 2 == 0:
               m[i][ii] //=2 
    return m

m = [[5, 4], [2, 3], [6, 7]]

print(incrementValues(m))

到目前为止,我有:

[[m for m in range(len(m))] for n in range(len(m))]

但我无法确定此信息的去向:

if m[i][ii] % 2 == 0:
    m[i][ii] //=2 

如果有人可以引导我朝正确的方向前进,那就太好了! (此外,随时建议我的原始代码是否可以用更好的方式编写)

谢谢:)

2 个答案:

答案 0 :(得分:0)

相应的列表理解为

m = [[5, 4], [2, 3], [6, 7]]
res = [[item//2 if item%2==0 else item for item in items] for items in m]

答案 1 :(得分:0)

您的代码不会创建列表,因此它可能不应该是列表理解,而是用于创建列表。

现在,通常来说,函数更改其输入是不好的。因此,确实,您可以创建一个新列表,而不用修改列表,并且可以通过列表理解来实现:

[[x//2 if x % 2 == 0 else x for x in sub] for sub in m]

但是这样做与您的代码有所不同。了解这一点很重要。

请注意,如果必须修改列表,则应采用以下方式:

def increment_values(m): # stick to python naming conventions
    for sub in m:
        for i, val in enumerate(sub):
            if val % 2 == 0:
               sub[i] //= 2 
    return m

当然,您也可以将切片分配与列表理解一起使用,尽管这会使代码的空间效率降低(这是就地修改列表的一个好方面) :

def increment_values(m): # stick to python naming conventions
    m[:] = [[x//2 if x % 2 == 0 else x for x in sub] for sub in m]
    return m

但是,如果您要完全执行此操作,则我更希望使用for循环版本(并且我更希望使用不会更改列表开头的版本...)