【问题标题】:Python List comprehension with items() and enumerate()使用 items() 和 enumerate() 的 Python 列表理解
【发布时间】:2017-12-27 20:00:30
【问题描述】:

我想实现这个:

asset_hist = []
for key_host, val_hist_list in am_output.asset_history.items():
     for index, hist_item in enumerate(val_hist_list):
        row = collections.OrderedDict([("computer_name", key_host), ("id", index), ("hist_item", hist_item)])
        asset_hist.append(row)

使用列表推导。这是我能得到的最接近的:

asset_hist = [collections.OrderedDict([("computer_name", key_host), ("id", index), ("hist_item", hist_item)]) for index, hist_item in enumerate((val_hist_list, key_host)[0]) for key_host, val_hist_list in am_output.asset_history.items()]

【问题讨论】:

  • 不要?可读性远比简洁重要。
  • 您或其他人之后是否需要阅读它?如果你写起来有困难......
  • 我完全理解你的担忧......但是阅读这个,是什么导致我提出这个问题,因为列表理解不使用附加:stackoverflow.com/questions/45240116/…
  • 您的理解中的 for 子句被颠倒了。它们应该与嵌套循环的顺序相同。
  • .append绝对不是你的问题。列表理解使用完全相同的底层操作无论如何,它只是没有方法解析开销,这是最小的,并且不能解释它挂了几个小时......

标签: python list list-comprehension enumerate items


【解决方案1】:

你很接近:

import collections

asset_hist = [collections.OrderedDict([("computer_name", key_host), ("id", index), ("hist_item", hist_item)]) for index, hist_item in enumerate(val_hist_list) for key_host, val_hist_list in am_output.asset_history.items()]

【讨论】:

  • 试过了。不起作用...最后一个 for 循环期望返回一个元组...获取“to many values to unpack error”。
  • 这无论如何都不是等价的!问题是 for 子句顺序错误。它们的顺序必须与等效的 for 循环相同。
  • 同意...我换了订单,它有效,但没有解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 1970-01-01
相关资源
最近更新 更多