2

我有一个带有两个列表的 python 程序,如下例所示:

list1=["a","b","c","d"]
list2=[0,1,1,0]

有没有一种优雅的方法来创建第三个列表,它在 list2 为 1 的位置包含 list1 的元素?我正在寻找类似于数组的 numpy.where 函数或更好的优雅方式的东西:

array1=numpy.array(["a","b","c","d"])
array2=numpy.array([0,1,1,0])
array3=array1[array2==1]

是否可以创建一个与 array3 等效的 list3,在此示例中包含“b”和“c”,还是我必须强制转换或使用循环?

4

3 回答 3

2

您可以在此处使用列表理解。

>>> array1 = ["a", "b", "c", "d"]
>>> array2 = [0, 1, 1, 0]
>>> [array1[index] for index, val in enumerate(array2) if val == 1] # Or if val
['b', 'c']

或使用,

>>> [a for a, b in zip(array1, array2) if b]
['b', 'c']
于 2013-08-12T13:48:51.230 回答
2

这正是itertools.compress所做的。

>>> list1=["a","b","c","d"]
>>> list2=[0,1,1,0]
>>> import itertools
>>> list(itertools.compress(list1, list2))
['b', 'c']
于 2013-08-12T14:26:30.600 回答
0

您可以执行以下列表理解:

[j for i,j in enumerate(list1) if list2[i]==1]

你的例子给出了:

['b','c']

构建get_val_where函数:

def get_val_where(list_val, list_where, val):
    return [j for i,j in enumerate(list_val) if list_where[i]==val]

使用喜欢get_val_where(list1,list2,1)

于 2013-08-12T13:58:04.757 回答