Python 如何通过列表理解或其他方式将一个列表一分为二

Python 如何通过列表理解或其他方式将一个列表一分为二,python,list,list-comprehension,Python,List,List Comprehension,如果您有这样一个字典项列表: 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] 显然,这不是最有效的方

如果您有这样一个字典项列表:

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

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

有更好的方法吗

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

谢谢

更新:
谢谢大家的评论和想法!对我来说,最容易读的是托马斯的那本。但我也会考虑亚历克斯的建议。我以前没有找到任何对集合模块的引用。

不要使用列表理解。列表理解适用于需要单个列表结果的情况。您显然没有:)使用常规for循环:

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

您可以通过这样做来缩短代码段,例如,
(A,B)[item['B']!=0]。追加(item)
,但是为什么要麻烦呢?

不要使用列表理解。列表理解适用于需要单个列表结果的情况。您显然没有:)使用常规for循环:

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

您可以通过这样做来缩短代码段,例如,
(A,B)[item['B']!=0]。追加(item)
,但为什么要麻烦呢?

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


当执行此代码时,
分离的
以一个
dict
结束(实际上是
集合的一个实例。defaultdict
,一个
dict
子类),其键是列表
L
中的
dict
中实际出现的
b
的所有值,对应的值是分离的子列表。因此,例如,如果
b
只取值
0
1
separated[0]
将是您想要的列表
A
,如果
b
值只能是0或1,则
separated[1]
将是您想要的列表
b
,@Thomas的简单解决方案可能是最好的。对于更一般的情况(在这种情况下,您想要区分
b
的几个可能值——您的示例“预期结果”似乎与您的问题文本完全脱节并相互矛盾,因此您是否确实需要一些一般性还远不明显;-):


当执行此代码时,
分离的
以一个
dict
结束(实际上是
集合的一个实例。defaultdict
,一个
dict
子类),其键是列表
L
中的
dict
中实际出现的
b
的所有值,对应的值是分离的子列表。因此,例如,如果
b
仅取值
0
1
分隔的[0]
将是您想要作为列表
A
,并且
分隔的[1]
您想要作为列表
b

的内容(在您问题的文本中,与示例相反),您不需要比较
项['b']
在这种特殊情况下使用
0
。这取决于项['b']的可能值是什么,但是是的,通常您会使用'if item['b']:'代替,并交换if和else套件。在这种特殊情况下,您不需要将
项['b']
0
进行比较。这取决于项['b']的可能值是什么是,但是是的,通常您会使用“if item['b']:”,并交换if和else套件。我假设第二个代码示例的键“b”的值有一个输入错误。我假设第二个代码示例的键“b”的值有一个输入错误