Python 将列表拆分为具有条件的多个列表

Python 将列表拆分为具有条件的多个列表,python,python-3.x,list,Python,Python 3.x,List,我有这样的代码,使4个列表从一个与我的条件。它取决于列表元素的符号。 我想得到一个包含所有正元素的列表,其中第一个元素是正元素,第二个元素是负元素,等等,所有的组合都是这样的。 当所有列表仅包含2个元素时,使用过滤器可以轻松创建4个列表 vals=[(0, 0), (0, 1), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 0), (-1, 1), (-1, -1)] new_f=list(filter(lambda x:x[0]>=0,vals)) ne

我有这样的代码,使4个列表从一个与我的条件。它取决于列表元素的符号。 我想得到一个包含所有正元素的列表,其中第一个元素是正元素,第二个元素是负元素,等等,所有的组合都是这样的。 当所有列表仅包含2个元素时,使用过滤器可以轻松创建4个列表

vals=[(0, 0), (0, 1), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 0), (-1, 1), (-1, -1)]
new_f=list(filter(lambda x:x[0]>=0,vals))
new_f=list(filter(lambda x:x[1]>=0,new_f))
print(new_f)
new_f=list(filter(lambda x:x[0]<=0,vals))
new_f=list(filter(lambda x:x[1]>=0,new_f))
print(new_f)
new_f=list(filter(lambda x:x[0]>=0,vals))
new_f=list(filter(lambda x:x[1]<=0,new_f))
print(new_f)
new_f=list(filter(lambda x:x[0]<=0,vals))
new_f=list(filter(lambda x:x[1]<=0,new_f))
print(new_f)
但如果我的元素的长度是3或更多,我能做什么来不写所有的条件(对于len=4,将有2**3种情况和2**4种情况) 例如,这里是我对n=3的输入,以及我想通过“没有负面”和“第一个负面其他非负面”来过滤的情况示例


因此,我需要对这个过程进行某种自动化,以便将其用于更长的数组。

制作一个列表。每个大列表的索引是比较的二进制方向:
1
True
为正,
0
False
为负。调用
掩码

迭代所有可能的掩码,从0到2^n-1。对于每个遮罩,将布尔向量转换为系数序列。例如,掩码
9
是二进制
1001
,一个系数序列[1,-1,-1,1]。用掩码乘以元组;比如说,

(0, 1, -1, 1) * [1, -1, -1, 1] => [0, -1, 1, 1]
根据候选列表中的
掩码和
元素,使用
all
功能过滤整个向量

all(bit >= 0 for bit in 
    [element[i] * mask[i] for i in len(element)])
现在,将其包装在循环中,循环遍历掩码值。如果您足够持久,可以使用
all
和嵌套理解,在一行代码中创建2^n个过滤列表的完整列表。我建议把它留给深夜黑客,而不是解决问题


还请注意,
itertools.permutations
将很乐意为您生成掩码。

您可以在两个过滤函数上使用
itertools.product
,并重复输入中元组的大小,然后
zip
过滤器在每个元组中使用单个项,并且仅在满足所有过滤器的情况下输出元组:

[[t for t in vals if all(f(i) for (f, i) in zip(filters, t))] for filters in product(((0).__le__, (0).__ge__), repeat=len(vals[0]))]
因此,考虑到您的示例输入:

vals = [(0, 0, 0), (0, 0, 1), (0, 0, -1), (0, 1, 0), (0, 1, 1), (0, 1, -1), (0, -1, 0), (0, -1, 1), (0, -1, -1), (1, 0, 0), (1, 0, 1), (1, 0, -1), (1, 1, 0), (1, 1, 1), (1, 1, -1), (1, -1, 0), (1, -1, 1), (1, -1, -1), (-1, 0, 0), (-1, 0, 1), (-1, 0, -1), (-1, 1, 0), (-1, 1, 1), (-1, 1, -1), (-1, -1, 0), (-1, -1, 1), (-1, -1, -1)]
这将返回:

[[(0, 0, 0),
  (0, 0, 1),
  (0, 1, 0),
  (0, 1, 1),
  (1, 0, 0),
  (1, 0, 1),
  (1, 1, 0),
  (1, 1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, 1, 0),
  (0, 1, -1),
  (1, 0, 0),
  (1, 0, -1),
  (1, 1, 0),
  (1, 1, -1)],
 [(0, 0, 0),
  (0, 0, 1),
  (0, -1, 0),
  (0, -1, 1),
  (1, 0, 0),
  (1, 0, 1),
  (1, -1, 0),
  (1, -1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, -1, 0),
  (0, -1, -1),
  (1, 0, 0),
  (1, 0, -1),
  (1, -1, 0),
  (1, -1, -1)],
 [(0, 0, 0),
  (0, 0, 1),
  (0, 1, 0),
  (0, 1, 1),
  (-1, 0, 0),
  (-1, 0, 1),
  (-1, 1, 0),
  (-1, 1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, 1, 0),
  (0, 1, -1),
  (-1, 0, 0),
  (-1, 0, -1),
  (-1, 1, 0),
  (-1, 1, -1)],
 [(0, 0, 0),
  (0, 0, 1),
  (0, -1, 0),
  (0, -1, 1),
  (-1, 0, 0),
  (-1, 0, 1),
  (-1, -1, 0),
  (-1, -1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, -1, 0),
  (0, -1, -1),
  (-1, 0, 0),
  (-1, 0, -1),
  (-1, -1, 0),
  (-1, -1, -1)]]
[[t for t in vals if all(f(i) for (f, i) in zip(filters, t))] for filters in product(((0).__le__, (0).__ge__), repeat=len(vals[0]))]
vals = [(0, 0, 0), (0, 0, 1), (0, 0, -1), (0, 1, 0), (0, 1, 1), (0, 1, -1), (0, -1, 0), (0, -1, 1), (0, -1, -1), (1, 0, 0), (1, 0, 1), (1, 0, -1), (1, 1, 0), (1, 1, 1), (1, 1, -1), (1, -1, 0), (1, -1, 1), (1, -1, -1), (-1, 0, 0), (-1, 0, 1), (-1, 0, -1), (-1, 1, 0), (-1, 1, 1), (-1, 1, -1), (-1, -1, 0), (-1, -1, 1), (-1, -1, -1)]
[[(0, 0, 0),
  (0, 0, 1),
  (0, 1, 0),
  (0, 1, 1),
  (1, 0, 0),
  (1, 0, 1),
  (1, 1, 0),
  (1, 1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, 1, 0),
  (0, 1, -1),
  (1, 0, 0),
  (1, 0, -1),
  (1, 1, 0),
  (1, 1, -1)],
 [(0, 0, 0),
  (0, 0, 1),
  (0, -1, 0),
  (0, -1, 1),
  (1, 0, 0),
  (1, 0, 1),
  (1, -1, 0),
  (1, -1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, -1, 0),
  (0, -1, -1),
  (1, 0, 0),
  (1, 0, -1),
  (1, -1, 0),
  (1, -1, -1)],
 [(0, 0, 0),
  (0, 0, 1),
  (0, 1, 0),
  (0, 1, 1),
  (-1, 0, 0),
  (-1, 0, 1),
  (-1, 1, 0),
  (-1, 1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, 1, 0),
  (0, 1, -1),
  (-1, 0, 0),
  (-1, 0, -1),
  (-1, 1, 0),
  (-1, 1, -1)],
 [(0, 0, 0),
  (0, 0, 1),
  (0, -1, 0),
  (0, -1, 1),
  (-1, 0, 0),
  (-1, 0, 1),
  (-1, -1, 0),
  (-1, -1, 1)],
 [(0, 0, 0),
  (0, 0, -1),
  (0, -1, 0),
  (0, -1, -1),
  (-1, 0, 0),
  (-1, 0, -1),
  (-1, -1, 0),
  (-1, -1, -1)]]