我有一个包含一些元素的列表,我想遍历所有可能的方法将这个列表分成两个列表。我的意思是所有组合,所以顺序无关紧要(即元素 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])
所以我基本上创建了一个长度为 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]])
关于python - 将列表拆分为两个列表的所有可能性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40709488/