python所有组合,在python中组合n个列表的所有元素

该博客探讨了如何利用itertools库的permutations和combinations函数来检查和替换列表内的子序列。代码示例展示了如何确保子列表长度一致,并检查元素是否按索引排列。同时,区分了置换和组合在处理重复元素时的不同。
摘要由CSDN通过智能技术生成

这是使用itertools置换和链函数的另一种方法。您还需要检查索引是否排成一行并且长度相同,以及是否有多个元素被替换from itertools import *

data_small = [ ['a','b','c'], ['d','e','f'] ]

data_big = [ ['a','b','c'], ['d','e','f'], ['u','v','w'], ['x','y','z'] ]

def check(data, sub):

check_for_mul_repl = []

for i in data:

if len(i) != len(data[0]):

return False

for j in i:

if j in sub:

if i.index(j) != sub.index(j):

return False

else:

if i not in check_for_mul_repl:

check_for_mul_repl.append(i)

if len(check_for_mul_repl) <= 2:

return True

print [x for x in list(permutations(chain(*data_big), 3)) if check(data_big, x)]

['a', 'b', 'c'], ['a', 'b', 'f'], ['a', 'b', 'w'], ['a', 'b', 'z'],

['a', 'e', 'c'], ['a', 'e', 'f'], ['a', 'v', 'c'], ['a', 'v', 'w'],

['a', 'y', 'c'], ['a', 'y', 'z'], ['d', 'b', 'c'], ['d', 'b', 'f'],

['d', 'e', 'c'], ['d', 'e', 'f'], ['d', 'e', 'w'], ['d', 'e', 'z'],

['d', 'v', 'f'], ['d', 'v', 'w'], ['d', 'y', 'f'], ['d', 'y', 'z'],

['u', 'b', 'c'], ['u', 'b', 'w'], ['u', 'e', 'f'], ['u', 'e', 'w'],

['u', 'v', 'c'], ['u', 'v', 'f'], ['u', 'v', 'w'], ['u', 'v', 'z'],

['u', 'y', 'w'], ['u', 'y', 'z'], ['x', 'b', 'c'], ['x', 'b', 'z'],

['x', 'e', 'f'], ['x', 'e', 'z'], ['x', 'v', 'w'], ['x', 'v', 'z'],

['x', 'y', 'c'], ['x', 'y', 'f'], ['x', 'y', 'w'], ['x', 'y', 'z']

这不关心是否有多个元素被替换

^{pr2}$

我使用置换而不是组合的原因是('d','b','c')在组合方面等于{},而不是在置换中

如果你只想要组合,那就简单多了。你能做到的def check(data) #Check if all sub lists are same length

for i in data:

if len(i) != len(data[0]):

return False

return True

if check(data_small):

print list(combinations(chain(*data_small), 3))

[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'b', 'e'), ('a', 'b', 'f'),

('a', 'c', 'd'), ('a', 'c', 'e'), ('a', 'c', 'f'), ('a', 'd', 'e'),

('a', 'd', 'f'), ('a', 'e', 'f'), ('b', 'c', 'd'), ('b', 'c', 'e'),

('b', 'c', 'f'), ('b', 'd', 'e'), ('b', 'd', 'f'), ('b', 'e', 'f'),

('c', 'd', 'e'), ('c', 'd', 'f'), ('c', 'e', 'f'), ('d', 'e', 'f')]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值