将 for 循环转换为带赋值的列表理解?

Convert for loop into list comprehension with assignment?

我正在尝试将带有赋值的 for 循环转换为列表理解。

更准确地说,我试图仅替换具有三个索引的列表中的一个元素。

可以做到吗?

for i in range(len(data)):
data[i][0] =  data[i][0].replace('+00:00','Z').replace(' ','T')

最佳

我相信这是可以做到的,但这不是最好的方法。 首先,您将为代码的外部 reader 创建一个大的琼斯复杂度。 其次,您将超过一行中首选的字符数,即 80 个。这将再次为 reader 带来复杂性问题。 第三是列表理解从列表理解到 return 事物,这里你改变你的原始列表。也不是最佳实践。

  • 虽然我不建议你在这种情况下使用list-comprehension,但如果你真的想使用它,这里有一个例子。
  • 它可以处理不同长度的 data,如果你需要的话。

代码:

data = [["1 +00:00",""],["2 +00:00","",""],["3 +00:00"]]
print([[i[0].replace('+00:00','Z').replace(' ','T'),*i[1:]] for i in data])

结果:

[['1TZ', ''], ['2TZ', '', ''], ['3TZ']]

如果你真的,真的想把它转换成列表理解,你可以尝试这样的事情,假设子列表有三个元素,正如你在问题:

new_data = [[a.replace('+00:00','Z').replace(' ','T'), b, c] for (a, b, c) in data]

请注意,这不会修改现有列表,但会创建一个新列表。但是,在这种情况下,我会坚持使用常规的 for 循环,这样可以更好地传达您实际在做什么。不过,您可以直接迭代元素,而不是迭代索引:

for x in data:
    x[0] =  x[0].replace('+00:00','Z').replace(' ','T')

列表理解在制作列表时很有用。所以,这里不推荐。但是,您仍然可以尝试这个简单的解决方案 -

print([ele[0].replace('+00:00','Z').replace(' ','T') for ele in data])