python - 将列表拆分为两个列表的所有可能性

标签 python list combinations 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])

所以我基本上创建了一个长度为 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/

相关文章:

python - 使用 GPS 坐标进行字典操作

Python:如果迭代器是一个表达式,是否每次都计算?

list - 删除 Prolog 中元素的第一次出现

c# - 合并列表列表中的交叉项

java - 使用 hibernate Criteria 返回一个集合而不是列表

python - 将旋转矩阵正确转换为 Mayavi/Vtk 的(俯仰、滚动、偏航)

python - 什么是查看 SQLAlchemy 事务的一般好方法,包括经过身份验证的用户等?

c# 与 linq 的组合

r - 找出向量的所有可能组合

algorithm - 概率雇佣-助手