Python 根据第二个列表中的值分隔列表
X:列表列表,其中每个列表元素对应于Y中的一个标签 Y:标签的二进制列表(值为1或0) 我想根据Y中相应索引处的值提取X中的元素,如下所示: 良好=X的值,其中Y中的标签/值为1Python 根据第二个列表中的值分隔列表,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,
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循环?我提供的代码片段将起作用,但您应该自己尝试解决这个问题。