Python 根据第二个列表中的值分隔列表

Python 根据第二个列表中的值分隔列表,python,Python,X:列表列表,其中每个列表元素对应于Y中的一个标签 Y:标签的二进制列表(值为1或0) 我想根据Y中相应索引处的值提取X中的元素,如下所示: 良好=X的值,其中Y中的标签/值为1 bad=X的值,其中Y中的标签/值为0 我对Python中的子设置还是相当陌生,并不确定有什么好方法可以做到这一点。list(itertools.compress(X,Y))将为您提供一系列好的列表列表(itertools.compress(X,[Y中的a不是a])将为您提供错误列表的列表 X = [[9, 8, 7,

X:列表列表,其中每个列表元素对应于Y中的一个标签

Y:标签的二进制列表(值为1或0)

我想根据Y中相应索引处的值提取X中的元素,如下所示:

良好=X的值,其中Y中的标签/值为1
bad=X的值,其中Y中的标签/值为0

我对Python中的子设置还是相当陌生,并不确定有什么好方法可以做到这一点。

list(itertools.compress(X,Y))
将为您提供一系列好的列表<代码>列表(itertools.compress(X,[Y中的a不是a])将为您提供错误列表的列表

X = [[9, 8, 7, 6], [5, 4, 3, 2], [10, 11, 12, 13]]
Y = [1, 0, 0]

good = []
bad = []
for i in range(0, len(Y)):

    if Y[i] == 1:
        good.append(X[i])

    else:
        bad.append(X[i])

现在只需打印出列表
good
bad

,您只需将
Y
作为所需分区的索引列表即可

xs = [[],[]]

for a, b in zip(X, Y):
    xs[b].append(a)

bad, good = xs

如果你的问题让你自然而然地想到要用一堆布来切片而不是循环,这可能是你应该使用NumPy的一个信号:

>>> x = np.array([[1,2,3], [4,5,6], [7,8,9]])
>>> y = np.array([1, 0, 1])
>>> y == 1
array([ True, False,  True])
>>> x[y == 1]
array([[1, 2, 3],
       [7, 8, 9]])

另一方面,如果这在循环方面是有意义的,那么简单的方法就是详细地写出循环语句,然后再找出如何将其转换为一个简洁的列表

那么,让我们将您的英文描述翻译成Python

首先,我们要将X的值与Y的相应值循环。这就是
zip
所做的。因此:

for x, y in zip(X, Y):
现在,如果
y
等于1,则
x
是好的。因此:

for x, y in zip(X, Y):
    if y == 1:
        # x is good
我们想要对好的
x
值做的是将它们收集到一个新列表中。因此:

good = []
for x, y in zip(X, Y):
    if y == 1:
        good.append(x)
这正符合列表理解的模式:您创建一个空列表,然后为创建一个
for
,其中包含零个或多个嵌套的
for
和/或
if
语句,并在底部向列表添加一个
append
。因此:

good = [x for x, y in zip(X, Y) if y == 1]
或者,由于
1
是真实的,而
0
是错误的:

good = [x for x, y in zip(X, Y) if y]
这看起来很一般,可以作为一个函数来总结:

def compress(X, Y):
    return [x for x, y in zip(X, Y) if y]
最后,像这样的许多有趣的循环模式已经被封装在函数中,或者,如果没有,则封装在第三方库中,如
more\u itertools
toolz
。所以,有必要对它们进行扫描,看看是否有什么东西已经完全满足了你的需求。事实上,有:

def compress(data, selectors):
    # compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
    return (d for d, s in zip(data, selectors) if s)
所以,你可以用它:

import itertools
good = list(itertools.compress(X, Y))
但是,即使你最终使用了
itertools
,你仍然值得自己学习如何编写这些东西。

[x代表x,y在zip中(x,y)如果y]
?但实际上,您是否尝试过用您描述的逻辑编写for循环?我提供的代码片段将起作用,但您应该自己尝试解决这个问题。