有什么方法可以在一行中重写以下python代码
for i in range(len(main_list)):
if main_list[i] != []:
for j in range(len(main_list[i])):
main_list[i][j][6]=main_list[i][j][6].strftime('%Y-%m-%d')
如下所示,
[main_list[i][j][6]=main_list[i][j][6].strftime('%Y-%m-%d') for i in range(len(main_list)) if main_list[i] != [] for j in range(len(main_list[i]))]
我为此收到了SyntaxError。
实际上,我正在尝试将从表中获取的所有值存储到一个列表中。由于表包含日期方法/数据类型,因此我需要将其转换为字符串,因为我遇到格式错误的字符串错误。
所以我的方法是将list的该元素从datetime.date()转换为str。而且我的工作。只希望它能与一行配合工作
答案 0 :(得分:3)
for
循环。没有更好的选择。列表理解用于创建新列表,而不是修改现有列表的某些元素。
您可能可以通过列表理解来更新值,例如[L.__setitem__(i, 'some_value') for i in range(len(L))]
,但是不建议您这样做,因为您使用的是副作用,并且在创建None
值列表之后将其丢弃。
您还可以使用三元语句编写卷积列表理解,该语句表示何时遇到第三嵌套子列表中的第六元素。但这会使您的代码难以维护。
简而言之,请使用for
循环。
答案 1 :(得分:1)
您收到语法错误,因为不允许您在列表理解范围内执行分配。 Python禁止分配,因为它不鼓励使用复杂的列表理解,而赞成使用for循环。
很明显,您不应该在一行上执行此操作,但这是这样做的方法:
this.lastVisible
列表理解是功能性的事情。如果您知道map()如何在python或javascript中工作,那是同一回事。在map()或理解中,我们通常不会更改正在映射的数据(并且python不鼓励尝试),因此,我们重新创建了整个对象,只替换了我们想要修改的值。
答案 2 :(得分:0)
一行?
main_list = convert_list(main_list)
尽管如此,您将不得不在其他地方放置几行:
def convert_list(main_list):
for i, ml in enumerate(main_list):
if isinstance(ml, list) and len(ml) > 0:
main_list[i] = convert_list(ml)
elif isinstance(ml, datetime.date):
main_list[i] = ml.strftime('%Y-%m-%d')
return main_list
您也许可以将其与列表理解一起使用,但这是一个糟糕的主意(出于其他原因可以更好地解释原因)。