python – 将列表分成两个列表的所有可能性

我有一些列表与一些元素,并希望迭代所有可能的方式将这个列表分成两个列表.由于我的意思是所有的组合,所以顺序并不重要(即元素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])

所以我基本上创建一个长度len(facs)-1的列表,并填充一个可能的组合的1和零.我然后用facs覆盖每个模式,除了始终在l1中的facs的最后一个元素,否则我会得到两次结果,因为我处理两个列表是一样的,不管列表是l1或l2.

有没有更快更优雅(更短/更多的pythonic)方法呢?

itertools具有可用于生成掩码和izip()的product(),可以组合列表以便于过滤.作为一个奖励,由于它们返回迭代器,它们不会占用很多内存.

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]])
翻译自:https://stackoverflow.com/questions/40709488/all-possibilities-to-split-a-list-into-two-lists

转载注明原文:python – 将列表分成两个列表的所有可能性