Pat*_*tuX 12 python combinations list permutation
我有一个包含一些元素的列表,并希望迭代所有可能的方法将此列表分成两个列表.我的意思是所有组合,所以顺序无关紧要(即元素1和3可以在一个列表中,元素2在另一个列表中).目前我这样做,facs我的初始列表在哪里:
patterns = []
for i in range(2**(len(facs)-1)):
pattern = []
for j in range((len(facs)-1)):
pattern.append(i//(2**j)%2)
patterns.append(pattern)
for pattern in patterns:
l1 = [facs[-1]]
l2 = []
for i in range(len(pattern)):
if pattern[i] == 1:
l1.append(facs[i])
else:
l2.append(facs[i])
Run Code Online (Sandbox Code Playgroud)
所以我基本上创建了一个长度列表,2^(len(facs)-1)并用每个可能的1和0组合填充它.然后我'覆盖'每个模式facs,除了最后一个元素facs总是在l1,因为我会得到每个结果两次,因为我处理两个相同的列表,无论列表是什么l1或l2.
是否有更快更优雅(更短/更pythonic)的方式来做到这一点?
itertools它product()可以用来生成掩码,并且izip()可以组合列表以方便过滤。作为奖励,由于它们返回迭代器,因此它们不使用太多内存。
from itertools import *
facs = ['one','two','three']
l1 = []
l2 = []
for pattern in product([True,False],repeat=len(facs)):
l1.append([x[1] for x in izip(pattern,facs) if x[0]])
l2.append([x[1] for x in izip(pattern,facs) if not x[0]])
Run Code Online (Sandbox Code Playgroud)