python if-else包含两个列表

python if-else包含两个列表,python,list-comprehension,Python,List Comprehension,我有以下代码: a = [] b = [] for row in range(10): if x[row] is True: a += list_features[row] else: b += list_features[row] 其中,list_features[row]是一个1D列表。我想在列表理解中这样做,我知道下面的代码会起作用: a+= [list_features[row] for row in (10) if x[row] is

我有以下代码:

a = []
b = []
for row in range(10):
    if x[row] is True:
        a += list_features[row]
    else:
        b += list_features[row]
其中,list_features[row]是一个1D列表。我想在列表理解中这样做,我知道下面的代码会起作用:

a+= [list_features[row] for row in (10) if x[row] is True]
b+= [list_features[row] for row in (10) if x[row] is False]

如果一行中只有一个理解,你会怎么做呢?

因为你有两个目标,列表理解不适用,使用两个理解意味着测试x[行]两次,一次构建a,一次构建b

更简洁一点的方法是使用三元表达式来选择目标,您不能直接在表达式上使用+=但可以使用extend,它做同样的事情:

(a if x[row] else b).extend(list_features[row])
也就是说,在进行顺序访问时,我不会使用row为两个列表编制索引,这两个列表都很麻烦、不和谐且性能不佳,但zip:


唯一的风险是其中一个列表比另一个列表短,在这种情况下,您不会得到任何错误,并且结果是不正确的。在这种情况下,给itertools.zip_longest一个合适的fillvalue可以作为替代方案。在这种情况下,您的列表理解几乎可以,因此您不需要前两行,而只需要列表理解,因此,不是:

a = []
b = []
for row in range(10):
    if x[row] is True:
        a += list_features[row]
    else:
        b += list_features[row]
使用

注意范围函数。

使用并去掉行计数器,因为您不需要它

a = [feature for feature, enabled in zip(list_features, x) if enabled]
b = [feature for feature, enabled in zip(list_features, x) if not enabled]

当您使用列表理解时,您是按照一种模式构建列表,而不是向现有列表添加元素。这也意味着你不必先申报

正确的语法是a=[[list_features[row],如果x[row]为True,则范围为10的行为]

另外,如果x[row]显式为true,则不必写,因为我假设x是一个布尔值数组


a=[[list_features[row]for row in range10 if x[row]]]

因为问题是在一行中完成:

a、 b=[list_features[row]用于范围10中的行,如果x[row]],[list_features[row]用于范围10中的行,如果不是x[row]]

这并不是假设x或列表元素是序列,它们可以是DICT

但是把所有的东西都放在一条线上是没有意义的。编写清晰的代码更为重要。

您可以使用

_ = [a += list_features[row] if x[row] is True else b += list_features[row] for row in range(10)]

为什么这里需要列表理解?这里的x是什么?x是从另一个布尔值列表中获取的布尔值。其实这并不重要,代码非常简单,我只是想知道它是否可能。你可能会丢失外部[],因为如果没有它,它会创建一个元组,可以很好地解压为a,b+1因为它们可能是dicts,可以证明使用下标符号而不是zip是正确的
a = [feature for feature, enabled in zip(list_features, x) if enabled]
b = [feature for feature, enabled in zip(list_features, x) if not enabled]
_ = [a += list_features[row] if x[row] is True else b += list_features[row] for row in range(10)]