基于python中的true / false元组的zip

时间:2013-10-31 23:35:39

标签: python list python-2.7 tuples

我想要一个由zip ed列表组成的变量,但只包含那些被选中的变量。也就是说,

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,看起来很难看。稍后我将需要对三个以上的列表做同样的事情,我觉得必须有一个更通用的解决方案。有吗?

3 个答案:

答案 0 :(得分:6)

我想代表你itertools.compress()

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

compress make一个迭代器,它从数据中过滤元素,只返回那些在选择器中具有相应元素且评估为True的元素。当数据或选择器迭代已经用完时停止。

答案 1 :(得分: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

答案 2 :(得分: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是{{1}的数量True)中的{s}。