扩展列表列表

时间:2015-08-03 19:47:50

标签: python list python-2.7 expandable

我正在寻找一种优化当前代码的方法:

        for result in results:
            if result != '':
                if isinstance(result, list):
                    for subresult in result:
                        if subresult != '':
                            worksheet.write(r, c, subresult)
                            c += 1
                else:
                    worksheet.write(r, c, result)
                    c += 1

我也在特定情况下使用它:

        for result in results:
            if isinstance(result, list):
                for subresult in result:
                    worksheet.write(r, c, subresult)
                    c += 1
            else:
                worksheet.write(r, c, result)
                c += 1

我有一个列表,在某些情况下只包含一个值,而在其他情况下,它包含多个值(即另一个列表)。

以下是列表可能包含的示例:

results = ['', '', '', '390', '66', ['Name', 'SerialNumber', 'Model', 'Year'], 'SW_Version', ['HD_Loc', 'HD_Model', 'HD_FW', 'HD_SerialNumber', 'Man_Yr', 'Man_Mth'], '', '', '']

最终我希望能够在excel中将每个值输出到自己的列。在某些情况下,我只想输出包含值的列表部分,这是由我提供的第一段代码执行的。在其他情况下,我想输出列表的所有部分,无论它是否有值,这是由我提供的第二段代码执行的。

我见过一个for循环和一些动作语句(比如说print)组合成一行python代码的实例,但我一直无法使用该语法用我提供的片段。

这段代码目前正在以我实现它的方式工作,我只是在寻找一种方法来缩短/优化它,因为我在里面的程序开始变得相当大并且能够缩短它会有所帮助我也缩短了该计划的其他部分。

提前致谢!

编辑:在这两种情况下,输出的顺序都很重要,我希望按照目前的顺序输出(只需减去''在一个场景中)。

4 个答案:

答案 0 :(得分:1)

你可以通过递归巧妙地做到这一点:

def worksheet_writer(results):
        if isinstance(results, list):
                for item in results: worksheet_writer(item)
        else:
                worksheet.write(r, c, results)
                c += 1

编辑支持字符串。

答案 1 :(得分:1)

好的,这是我到目前为止的解决方案。这是一种凌乱的列表理解。我会尝试清理一下。

results = ['', '', '', '390', '66', ['Name', 'SerialNumber', 'Model', 'Year'], 'SW_Version', ['HD_Loc', 'HD_Model', 'HD_FW', 'HD_SerialNumber', 'Man_Yr', 'Man_Mth'], '', '', '']
li = list(set([item if type(sublist) is list else sublist for sublist in results for item in sublist]))
print li

这给出了输出:

['SW_Version', 'Name', 'HD_FW', 'SerialNumber', 'HD_Model', 'HD_SerialNumber', '390', '66', 'Year', 'Model', 'Man_Yr', 'HD_Loc', 'Man_Mth']

答案 2 :(得分:1)

我希望这有帮助,

results = ['', '', '', '390', '66', ['Name', 'SerialNumber', 'Model', 'Year'], 'SW_Version', ['HD_Loc', 'HD_Model', 'HD_FW', 'HD_SerialNumber', 'Man_Yr', 'Man_Mth'], '', '', '']

flatList = [item for sublist in [[item] if not isinstance(item,list) else item for item in results] for item in sublist]

flatListWithoutBlanks = [item for item in [item for sublist in [[item] if not isinstance(item,list) else item for item in results] for item in sublist] if item != '' ]

最好的,

答案 3 :(得分:1)

我在评论中发布了它,但不确定它是否会清楚,

flatListWithoutBlanks = [item for item in [item for sublist in [[item] if not isinstance(item,list) else item for item in results] for item in sublist] if item != '' ]