1

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

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 子句。

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

有一个更好的方法吗?

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

谢谢!

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

4

2 回答 2

5

不要使用列表推导。列表推导适用于您需要单个列表结果时。你显然不 :) 使用常规的 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),但是为什么要麻烦呢?

于 2010-01-22T17:27:07.543 回答
3

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

from collections import defaultdict

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

当这段代码执行时,separated最终得到一个dict(实际上是 的一个实例collections.defaultdict,一个dict子类),它的键是b实际出现在dicts 中的所有值 list L,对应的值是分离的子列表。因此,例如, ifb仅采用值01,separated[0]将是您想要作为 list 的内容(在您的问题文本中,而不是示例中)A,以及separated[1]您想要作为 list的内容B

于 2010-01-22T18:41:02.990 回答