【问题标题】:How to convert conditional for-loop into list comprehension?如何将条件 for 循环转换为列表理解?
【发布时间】:2021-05-08 00:16:26
【问题描述】:

我有一个带有if 条件的for 循环,我想将其转换为列表理解,循环看起来像这样

if options.accounts.lower() == "all":
    orgPaginator = org.get_paginator('list_accounts_for_parent')
    for orgPages in orgPaginator.paginate(ParentId=src_ou_id):
        for account in orgPages['Accounts']:
            acc.append(account["Id"])
else:
    for account in options.accounts.split(','):
        acc.append(account)

这就是我现在所拥有的,我可以弄清楚其他部分,但我在转换它的第一部分时遇到问题

[<??> if options.accounts.lower() == "all" else acc.append(account) for account in options.accounts.split(',')]

有人可以提供一些关于如何将第一部分转换为解释的指导吗?

【问题讨论】:

  • 我真的不会尝试将其写为列表理解。它可能几乎不可读,尤其是因为if 的一个分支有两个嵌套循环,而另一个只有一个。
  • 这不是列表理解材料
  • @Nick:作为 两个 列表推导式,您可以根据现有的外部 if 选择要使用的推导式。
  • @ShadowRanger 我并不是想说它不能完成,只是列表理解可能难以理解:)
  • 为什么要将其转换为列表理解?

标签: python list-comprehension


【解决方案1】:
if options.accounts.lower() == "all":
    acc += [account["Id"] for account in [orgPages["Accounts"] for orgPages in org.get_paginator('list_accounts_for_parent').paginate(ParentId=src_ou_id)]]
else:
    acc += [account for account in options.accounts.split(',')]

应该这样做。如果可能的话,我认为纯粹的列表理解方法不会更好。

您的&lt;??&gt; 似乎是您真正想要放入列表的内容:

[f(x) for x in iterable]

在这种情况下,f(x) 将是 x[...]。

【讨论】:

  • 感谢您查看它我确实尝试过acc += [account["Id"] for account in [orgPages["Accounts"] for orgPages in org.get_paginator('list_accounts_for_parent')]],但这会引发此错误ERROR! Uncaught Exception in run: 'Organizations.Paginator.ListAccountsForParent' object is not iterable
  • 我的错,我忘了复制你的一些代码......现在应该可以工作了
  • 它现在抛出一个差异错误ERROR! Uncaught Exception in run: list indices must be integers or slices, not str
  • 我认为是导致问题的帐户["Id"]
  • acc += [account for account in options.accounts.split(',')] 应该只是acc += options.accounts.split(','); str.split 已经返回了一个 list,即使它返回了一些其他的可迭代对象,也没关系,因为 list+= 处理任意可迭代对象。
【解决方案2】:

我/我们可以做到这一点(编辑:在@ShadowRanger 的帮助下):

acc += [p['Accounts'] for p in org.get_paginator('list_accounts_for_parent').paginate(ParentId=src_ou_id)] \
        if options.accounts.lower() == "all" else \
        options.accounts.split(',')

【讨论】:

  • [a for a in options.accounts.split(',')] 可以是options.accounts.split(','),不需要listcomp。而[a for a in (p['Accounts'] for p in org.get_paginator('list_accounts_for_parent').paginate(ParentId=src_ou_id))] 应该真的是[p['Accounts'] for p in org.get_paginator('list_accounts_for_parent').paginate(ParentId=src_ou_id)](当它可能是一个单独的listcomp 做工作时,为什么要在genexpr 周围使用no-op listcomp?)。
  • @ShadowRanger 是的,当然 - 傻我 - 谢谢。
猜你喜欢
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
相关资源
最近更新 更多