【问题标题】:Expanding list of lists扩展列表列表
【发布时间】:2015-08-03 19:47:50
【问题描述】:

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

        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 中自己的列。在某些情况下,我只想输出列表中包含值的部分,这是由我提供的代码的第一个 sn-p 执行的。在其他情况下,我想输出列表的所有部分,无论它是否有值,这是由我提供的代码的第二个 sn-p 执行的。

我已经看到 for 循环和一些操作语句(比如说 print)被组合成一行 python 代码的实例,但我无法让该语法与 sn- ps 我已经提供了。

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

提前致谢!

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

【问题讨论】:

  • 那么您想将列表列表转换为简单列表吗?
  • 实际上是的。当我执行上述代码时,我得到['', '', '', '390', '66', 'Name', 'SerialNumber', 'Model', 'Year', 'SW_Version', 'HD_Loc', 'HD_Model', 'HD_FW', 'HD_SerialNumber', 'Man_Yr', 'Man_Mth', '', '', ''],这就是我想要输出到我的 excel 文件的内容(每个都在自己的单元格中。)
  • 看看这个链接和OP中的链接stackoverflow.com/questions/952914/…
  • 杰里米,我试过了,但我收到了这个:['3', '9', '0', '6', '6', 'Name', 'SerialNumber', 'Model', 'Year', 'S', 'W', '_', 'V', 'e', 'r', 's', 'i', 'o', 'n', 'HD_Loc', 'HD_Model', 'HD_FW', 'HD_SerialNumber', 'Man_Yr', 'Man_Mth'] 看起来列表中没有的任何东西都会被字符分开,但列表中的任何东西都很好。
  • 我发布了一个暂定的解决方案。我会试着把它清理一下

标签: python list python-2.7 expandable


【解决方案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 != '' ]

最好的,

【讨论】:

  • 谢谢,这确实适用于我提供的第二个 sn-p 代码,我想在其中输出空白 '',但是有没有办法让它适用于第一个 sn-p我想在哪里排除空白''
  • 我投了赞成票,但目前没有显示,因为我没有足够的声誉:(。仍然是 StackOverflow 菜鸟。
  • 没问题。祝你有美好的一天。
【解决方案2】:

好的,这就是我目前得到的解决方案。这是一个有点混乱的列表理解。我会试着清理一下。

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']

【讨论】:

  • 这确实有效,但它会乱序移动列表中的值。抱歉,我忘了说顺序很重要,我会更新我的问题。
【解决方案3】:

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

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

已编辑以支持字符串。

【讨论】:

  • jpcgt,我试过这个并收到“Traceback (most recent call last): File "<tmp 2>", line 11, in <module> worksheet_writer(results) File "<tmp 2>", line 3, in worksheet_writer for item in results: worksheet_writer(item)...(repeates for awhile)... File "<tmp 2>", line 3, in worksheet_writer for item in results: worksheet_writer(item) RuntimeError: maximum recursion depth exceeded
  • 这将导致字符串上的堆栈溢出,因为迭代字符串会产生字符串。
  • @RC_Crusher07:我刚刚修改了支持字符串的答案。不过,同样的递归技术。
  • @jpcgt:这适用于我添加的第二个 sn-p 代码,但对于我想要排除空白 '' 的第一部分,哪里是添加的最佳位置item != ''?
  • @RC_Crusher07:用elif results != '': 代替else:。未添加行!
【解决方案4】:

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

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 != '' ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2011-09-25
    • 2014-02-21
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多