我正在尝试将以下代码实现为列表理解:
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
如果有人可以引导我朝正确的方向前进,那就太好了! (此外,随时建议我的原始代码是否可以用更好的方式编写)
谢谢:)
答案 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循环版本(并且我更希望使用不会更改列表开头的版本...)