【问题标题】:One liner for extend loop python一个用于扩展循环 python 的衬垫
【发布时间】:2017-11-10 13:27:34
【问题描述】:

我有以下代码行:

records = []

for future in futures:
  records.extends(future.result())

每个未来都会返回一个列表。

我怎样才能把上面的代码写在一个班里?

records = [future.result() for future in futures]

会在列表中生成一个列表。

我有数百万条记录,我宁愿在列表内创建列表后不将其扁平化

【问题讨论】:

  • 你试过records.extends(future.result() for future in futures)吗?
  • 我刚刚在下面得到了这个答案——但是这样我需要在另一行声明 records = [] 。这将使它成为 2 行
  • @Dejell 不要假设每个循环总是有一个合理的单线。我发现您的原始循环比公认的 oneliner 稍微清晰一些(尽管我不会在代码审查中反对它)。
  • @Dejell 我更新了我的答案,检查一下它是否适合你,我做了一些研究,我会感谢你的反馈

标签: python


【解决方案1】:
records = [r for future in futures for r in future.result()]

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点:

    1. 使用itertools.chain:
      records = list(itertools.chain.from_iterable(future.result() for future in futures))
    2. 使用itertools 消费配方:
      records = collections.deque((records.extend(future.result()) for future in futures), maxlen=0)
    3. 使用一次性清单:
      [records.extend(future.result()) for future in futures]records现在将拥有所有需要的内容,并且您将暂时列出Nones

    您也可以使用functools.reduce(operator.add, (future.result() for future in futures)),但这不会很好地扩展

    【讨论】:

    • 关于第三个建议 - 我需要在另一行声明记录
    • 从不喜欢使用列表推导来解决副作用。只需使用一个循环 - [print(x) for x in iterable] - 啊!投票给第一名。第二名不就是抛弃一切吗?
    • @AChampion:你是对的。我只是想覆盖所有的基础。感谢关于#2 的错误报告。现已修复
    • @AChampion 您对我的回答中的评论是正确的,我将其编辑为不再犯同样的错误
    • @inspectorG4dget 非常感谢您的分享,这对我做出更好的回答很有帮助!加一个给你
    【解决方案3】:

    我想这就是你要找的东西

    import functools
    records = functools.reduce(lambda res, future: res + future.result()), futures, [])
    

    【讨论】:

    • 但是我需要在不同的行中声明记录。这是 2 行:records = [] first
    • 这是对列表推导的滥用,将其用于表达式的副作用,而不是实际使用它创建的Nones 列表。
    • @chepner 我该如何改进它?
    • @chepner,你知道在 lambda 中返回列表的方法吗?
    • 如果你打算使用reduce,你会像inspectorG4dget的回答那样使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2014-08-13
    • 2017-07-05
    • 2016-04-29
    • 1970-01-01
    相关资源
    最近更新 更多