如何使用其他列表屏蔽列表

时间:2018-11-28 20:47:22

标签: python

我有一个这样的列表:

x = [True False True False]

和类似的列表:

y = [a b c d]

我想在y上遮盖x以获得此输出:

output = [a c]

我知道如何使用while / for循环来做到这一点,但是理想情况下,使用列表理解来寻找优雅的一行代码。

4 个答案:

答案 0 :(得分:6)

您可以使用 select email, sum(case when productid=10 then 1 else 0 end) as product_10, sum(case when productid=20 then 1 else 0 end) as product_20 from mytable group by email 和列表推导根据zip中相应的真值对y进行过滤操作:

x

输出:

x = [True, False, True, False]
y = ["a", "b", "c", "d"]

print([b for a, b in zip(x, y) if a])

Try it!

答案 1 :(得分:1)

我认为最简单的方法是使用numpy

import numpy as np
>>> x = [True, False, True, False]
>>> y = ['a', 'b', 'c', 'd']
>>> np.array(y)[x]
array(['a', 'c'], dtype='<U1')

如果没有numpy,您还可以列举列表理解:

>>> [i for idx, i in enumerate(y) if x[idx]]
['a', 'c']

答案 2 :(得分:1)

@NBC。解决起来很简单。考虑正确编写您的列表

x = [True, False, True, False]
y = [a, b, c, d]  # assuming that a, b, c and d are some kind of object
output = []
for i, k in enumerate(x):
    if k:
        output.append(x[i])

答案 3 :(得分:0)

有几种方法可以做到这一点。

最简单的方法是将两个列表压缩在一起,并使用列表推导来保留所需的项目。

x = [True, False, True, False]
y = ['a', 'b', 'c', 'd']

print([item for keep, item in zip(x, y) if keep])

您还可以将y数组转换为numpy数组,并使用x数组屏蔽numpy数组。

import numpy as np

x = [True, False, True, False]
y = ['a', 'b', 'c', 'd']

print(list(np.array(y)[x]))

最后,您可以创建一个空列表,使用它们的索引迭代x和y数组,如果x中的对应元素为True,则将y中的元素附加到空列表中。

x = [True, False, True, False]
y = ['a', 'b', 'c', 'd']

temp = []

for index in range(len(y)):
    if x[index]:
        temp.append(y[index])

print(temp)