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