1

我想要一个由zip编辑列表组成的变量,但只有那些被选中的。那是,

selected = (True, True, False)
mylist1 = [1,2,4]
mylist2 = [4,5,8]
mylist3 = [3,2,7]

所以,我想要的是得到mylist = zip(mylist1, mylist2)如果selected像上面那样。也就是说,我zip只想要那些标记为True. 目前我有一堆if-else,它看起来很丑。以后我需要对三个以上的列表做同样的事情,我觉得必须有一个更通用的解决方案。在那儿?

4

3 回答 3

6

我喜欢代表你itertools.compress()

lists = [mylist1, mylist2, mylist3]
result = zip(*itertools.compress(lists, selected))

compress 创建一个迭代器,它从数据中过滤元素,只返回那些在选择器中具有相应元素且计算结果为 True 的元素。当数据或选择器迭代已用尽时停止。

于 2013-10-31T23:52:08.733 回答
4

更多zip

lists = [mylist1, mylist2, mylist3]
selected_lists = (b for a, b in zip(selected, lists) if a)
result = zip(*selected_lists) # itertools if necessary
于 2013-10-31T23:37:27.457 回答
1

您可以使用numpy' 索引。

import numpy as np
selected = np.array([True, True, False])
lists = np.array([mylist1, mylist2, mylist3], dtype = 'object')
zip(*(lists[selected]))

请注意,要使其正常工作,selected需要是一个 numpy 数组,而不是元组。

实际上,您可以选择跳过对zip. lists[selected]已经是一个类似于您调用结果的对象zip- 它是可迭代的,并且每个元素都是具有 N 个元素的序列(其中 N 是Trues in的数量selected)。

于 2013-10-31T23:40:05.303 回答