将python代码组织/格式化为一行

将python代码组织/格式化为一行,python,list,for-loop,nested,Python,List,For Loop,Nested,有没有办法在一行中重写下面的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')

有没有办法在一行中重写下面的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,然后我就可以工作了。只想让它与一行一起工作

使用显式的
for
循环。没有更好的选择了。 列表理解用于创建新的列表,而不是修改现有列表的某些元素

您可以通过列表理解来更新值,例如,范围(len(L))]内i的
[L.\uuuu setitem\uuuuu(i,'some_value')]
,但不建议这样做,因为您使用的是副作用,并且在创建
值列表的过程中会丢弃这些值

您还可以编写一个复杂的列表,其中包含一个三元语句,指示您何时遇到第三个嵌套子列表中的第六个元素。但这将使您的代码难以维护

简而言之,使用
for
循环。

使用显式
for
循环。没有更好的选择了。 列表理解用于创建新的列表,而不是修改现有列表的某些元素

您可以通过列表理解来更新值,例如,范围(len(L))]内i的
[L.\uuuu setitem\uuuuu(i,'some_value')]
,但不建议这样做,因为您使用的是副作用,并且在创建
值列表的过程中会丢弃这些值

您还可以编写一个复杂的列表,其中包含一个三元语句,指示您何时遇到第三个嵌套子列表中的第六个元素。但这将使您的代码难以维护

简而言之,将
用于
循环。

一行

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
你也许可以用一个列表来理解这一点,但这是一个糟糕的想法(原因在另一个答案中有更好的解释)

一行

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

你也许可以用一个列表来理解这一点,但这是一个糟糕的想法(原因在另一个答案中有更好的解释)

您遇到语法错误,因为您不允许在列表中执行赋值。Python禁止赋值,因为它不支持复杂的列表理解,而支持for循环

显然,您不应该在一行上完成此操作,但这是如何做到的:

import datetime

# Example from your comment:
type1 = "some type"
main_list = [[], [],
             [[1, 2, 3, datetime.date(2016, 8, 18), type1],
              [3, 4, 5, datetime.date(2016, 8, 18), type1]], [], []]


def fmt_times(lst):
    """Format the fourth value of each element of each non-empty sublist"""
    for i in range(len(lst)):
        if lst[i] != []:
            for j in range(len(lst[i])):
                lst[i][j][3] = lst[i][j][3].strftime('%Y-%m-%d')
    return lst


def fmt_times_one_line(main_list):
    """Format the fourth value of each element of each non-empty sublist"""
    return [[] if main_list[i] == [] else [[main_list[i][j][k] if k != 3 else main_list[i][j][k].strftime('%Y-%m-%d') for k in range(len(main_list[i][j]))] for j in range(len(main_list[i])) ] for i in range(len(main_list))]

import copy

# Deep copy needed because fmt_times modifies the sublists.
assert fmt_times(copy.deepcopy(main_list)) == fmt_times_one_line(main_list)

列表理解是一种功能性的东西。如果您知道map()在python或javascript中是如何工作的,那么也是一样的。在map()或comprehension中,我们通常不会对正在映射的数据进行变异(python不鼓励尝试这样做),因此我们会重新创建整个对象,只替换要修改的值。

您会遇到语法错误,因为不允许您在列表理解中执行赋值。Python禁止赋值,因为它不支持复杂的列表理解,而支持for循环

显然,您不应该在一行上完成此操作,但这是如何做到的:

import datetime

# Example from your comment:
type1 = "some type"
main_list = [[], [],
             [[1, 2, 3, datetime.date(2016, 8, 18), type1],
              [3, 4, 5, datetime.date(2016, 8, 18), type1]], [], []]


def fmt_times(lst):
    """Format the fourth value of each element of each non-empty sublist"""
    for i in range(len(lst)):
        if lst[i] != []:
            for j in range(len(lst[i])):
                lst[i][j][3] = lst[i][j][3].strftime('%Y-%m-%d')
    return lst


def fmt_times_one_line(main_list):
    """Format the fourth value of each element of each non-empty sublist"""
    return [[] if main_list[i] == [] else [[main_list[i][j][k] if k != 3 else main_list[i][j][k].strftime('%Y-%m-%d') for k in range(len(main_list[i][j]))] for j in range(len(main_list[i])) ] for i in range(len(main_list))]

import copy

# Deep copy needed because fmt_times modifies the sublists.
assert fmt_times(copy.deepcopy(main_list)) == fmt_times_one_line(main_list)

列表理解是一种功能性的东西。如果您知道map()在python或javascript中是如何工作的,那么也是一样的。在map()或comprehension中,我们通常不会改变映射的数据(python不鼓励尝试这样做),因此我们会重新创建整个对象,只替换我们想要修改的值。

什么是
所有问题
?您能提供一些示例输入数据吗,例如a?很抱歉,这是一个输入错误。。它应该是主要问题,而不是所有问题。。我已经更正了上面的片段。它会像下面这样,main_list=[[],[],[[x,y,z,datetime.date(2016,8,18),type1],[a,b,c,datetime.date(2016,8,18),type1],[],[]你想要的输出是什么?您需要更新
main\u列表
,还是只想用
datetime
对象创建一个新列表?列表将创建一个新列表。是。。我需要更新主列表。将具有值datetime.date(2016,8,18)的元素替换为“2016-8-18”所有问题的
是什么?您能提供一些示例输入数据吗,例如a?很抱歉,这是一个输入错误。。它应该是主要问题,而不是所有问题。。我已经更正了上面的片段。它会像下面这样,main_list=[[],[],[[x,y,z,datetime.date(2016,8,18),type1],[a,b,c,datetime.date(2016,8,18),type1],[],[]你想要的输出是什么?您需要更新
main\u列表
,还是只想用
datetime
对象创建一个新列表?列表将创建一个新列表。是。。我需要更新主列表。将具有值datetime.date(2016,8,18)的元素替换为“2016-8-18”