【问题标题】:How to separate one list in two via list comprehension or otherwise如何通过列表理解或其他方式将一个列表分成两个
【发布时间】:2010-01-22 17:23:42
【问题描述】:

如果有这样的字典项目列表:

L = [{"a":1, "b":0}, {"a":3, "b":1}...]

我想根据“b”的值(0 或 1)拆分这些条目。

A(b=0) = [{"a":1, "b":1}, ....]
B(b=1) = [{"a":3, "b":2}, .....]

我对使用简单的列表推导很满意,我目前正在循环列表 L 两次。

A = [d for d in L if d["b"] == 0]
B = [d for d in L if d["b"] != 0]

显然这不是最有效的方法。

列表理解功能中似乎没有 else 子句。

我可以通过列表理解做我想做的事吗?

有没有更好的方法来做到这一点?

我正在寻找可读性和效率之间的良好平衡,倾向于可读性。

谢谢!

更新: 感谢大家的cmets和想法!对我来说最容易阅读的是托马斯的一本书。但我也会看看亚历克斯的建议。我之前没有找到任何对集合模块的引用。

【问题讨论】:

  • 我假设第二个代码示例的键“b”的值有错字

标签: python list list-comprehension


【解决方案1】:

不要使用列表推导。列表推导适用于您需要单个列表结果时。你显然不 :) 使用常规的 for 循环:

A = []
B = []
for item in L:
    if item['b'] == 0:
        target = A
    else:
        target = B
    target.append(item)

您可以通过例如(A, B)[item['b'] != 0].append(item) 来缩短 sn-p,但何必呢?

【讨论】:

  • 在这种特殊情况下,您无需将item['b']0 进行比较。
  • 这取决于 item['b'] 的可能值是什么,但是是的,通常你会使用 'if item['b']:' 代替,并交换 if 和 else 套件.
【解决方案2】:

如果b 的值只能是0 或1,@Thomas 的简单解决方案可能是最好的。对于更一般的情况(在这种情况下,您想要区分 b 的几个可能值 - 您的样本“预期结果”似乎与您的问题文本完全脱离并相互矛盾,因此您是否真的需要一些普遍性;-):

from collections import defaultdict

separated = defaultdict(list)
for x in L:
  separated[x['b']].append(x)

当此代码执行时,separateddict(实际上是 collections.defaultdict 的一个实例,dict 子类)结束,其键是 b 的所有值,实际上出现在 dicts在列表L 中,对应的值是分隔的子列表。因此,例如,如果b 仅采用值01separated[0] 将是您想要的列表Aseparated[1](在您的问题文本中而不是示例中)你想要的列表B

【讨论】:

    猜你喜欢
    • 2013-04-15
    • 2022-12-22
    • 2023-02-03
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    相关资源
    最近更新 更多