给定列表和位掩码,如何返回真值的索引对应的值?

10 投票
4 回答
8710 浏览
提问于 2025-04-16 03:13

我有一个列表 s 和一个位掩码 b,它们的内容如下:

s = ['baa', 'baa', 'black', 'sheep', 'have', 'you', 'any', 'wool']
b = [1, 0, 0, 0, 1, 1, 1, 0] # or any iterable with boolean values

我该如何写一个函数 apply_bitmask(s, b),让它返回

['baa', 'have', 'you', 'any']

4 个回答

8

你可以使用列表推导式来实现这个功能:

newList = [word for (word, mask) in zip(s,b) if mask]
# Note: Could also use 'if mask == blah', if mask is not a boolean-compatible type.

首先,它会把原来的两个列表合并在一起,这个过程叫做压缩,这样你就得到了一个临时的列表,里面是单词和它们对应的标记成对出现,像这样[('baa',1), ('baa',0),...]。然后,只有那些标记为1的单词(if mask == 1)会被添加到newList中。

11

这段代码的意思是……

首先,它定义了一些变量,这些变量就像是用来存储信息的盒子。你可以把它们想象成你在写作业时用来记录答案的地方。

接下来,代码里有一些操作,这些操作就像是你在做数学题时的步骤。每一步都会对之前的结果进行处理,最终得到一个新的结果。

最后,代码会输出结果,也就是把计算的答案显示出来,就像你完成作业后把答案写在纸上一样。

总的来说,这段代码就是在做一些计算和处理,然后把结果告诉你。希望这样解释能让你更容易理解!

[ item for item, flag in zip( s, b ) if flag == 1 ]
20

在Python 3.1中,有一个叫做 itertools.compress 的功能(如果你还没升级,可以用 Python 2.7 的版本),它正好可以做到这一点(用列表推导式也差不多)。

import itertools
filtered = itertools.compress(s, b)

需要注意的是,这个功能返回的是一个迭代器,而不是一个列表。这样做可以节省内存,但如果你需要多次遍历这个结果或者使用索引,你可以用 list(itertools.compress(s, b)) 来转换成列表。这样写依然简洁。

撰写回答