为了账号安全,请及时绑定邮箱和手机立即绑定

Python 组合和产品

Python 组合和产品

一只斗牛犬 2021-09-11 20:29:43
我有一个数据框列的列表:L=[AA ,  AS  ,  AD  , BB  , BC  , CD ,  CF,CG ]我需要所有项目的组合,没有特定的顺序。但是,在每个组合中我只能有一个以 A 开头的名字,但我可以有多个以 C 开头或没有开头的名字。关于 B,我必须至少有 1 个 B,但可以有更多所以我需要所有的组合A=[AA,AS,AD] #only one of theseB=[BB,BC]  #at least one of theseall_others=[CD,CF,CG]  #All, 1, 2 or none of these到目前为止,我有这个代码;from itertools import productfor choices in product(['AA','AS','AD',None],['BB', 'BC', None], ['CD','CF', None],):    print(' '.join(column for column in choices if column))然而,这有效,它只允许一个以 C 开头的值,但我想要 C 的product所有组合。任何人都可以看到我可以进行的良好编辑吗?总结; 我需要列表中名称的所有组合。根据一条规则,您不能有多个以 A 开头的变量和多个以 B 开头的变量
查看完整描述

3 回答

?
达令说

TA贡献1821条经验 获得超6个赞

试试这个而不是你的for循环:


for choices in itertools.product(['AA','AS','AD',None],['BB', 'BC', None],[' '.join(k) for j in list(itertools.combinations(['CD','CF'],i) for i in range(3)) for k in j]):

    # do what you need

使用选项的输出print(' '.join(column for column in choices if column))是:


AA BB

AA BB CD

AA BB CF

AA BB CD CF

AA BC

AA BC CD

AA BC CF

AA BC CD CF

AA

AA CD

AA CF

AA CD CF

AS BB

AS BB CD

AS BB CF

AS BB CD CF

AS BC

AS BC CD

AS BC CF

AS BC CD CF

AS

AS CD

AS CF

AS CD CF

AD BB

AD BB CD

AD BB CF

AD BB CD CF

AD BC

AD BC CD

AD BC CF

AD BC CD CF

AD

AD CD

AD CF

AD CD CF

BB

BB CD

BB CF

BB CD CF

BC

BC CD

BC CF

BC CD CF


CD

CF

CD CF

我建议你更换None用''或删除它们。


查看完整回答
反对 回复 2021-09-11
?
aluckdog

TA贡献1847条经验 获得超7个赞

当然要表达


all_others=[CD,CF,CG]  #All, 1, 2 or none of these

把它分解为


all_others=[CD]  #one or none of these

all_others=[CF]  #one or none of these

all_others=[CG]  #one or none of these

然后你的代码变成


from itertools import product


for choices in product(['AA','AS','AD',None],['BB', 'BC', None], ['CD', None], ['CF', None], ['CG', None],):

    print(' '.join(column for column in choices if column))

这处理这个特殊的例子。但是,如果您有多个以 C 开头的项目,则可以按如下方式更系统地处理它们:


from itertools import product


for choices in product(['AA','AS','AD',None],['BB', 'BC', None], *product(['CD', 'CF', 'CG'], [None]),):

    print(' '.join(column for column in choices if column))

为了解释发生了什么,取['CD', 'CF', 'CG']with的乘积会[None]产生一个迭代器,其中包含


('CD', None), ('CF', None), ('CG', None)

这些正是我们希望传递给product 的*参数。运算符将迭代器内的元素转换为函数参数。因此上面的两个代码片段是等价的。


查看完整回答
反对 回复 2021-09-11
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

这是做你想要的那种事情的更强大/更通用的方法。我首先定义一个辅助函数:


from itertools import combinations, chain, product


def subsets_of_length(s, lengths):

    return chain.from_iterable(combinations(s,l) for l in lengths)

它产生以下输出:


>>>> list(subsets_of_length(['a','b','c'], range(2,4)))

[('a', 'b'), ('a', 'c'), ('b', 'c'), ('a', 'b', 'c')]


>>>> list(subsets_of_length(['d','e'], range(0,2)))

[(), ('d',), ('e',)]

现在我们要组合两个或多个子集如下


>>>> for choices in product(

         subsets_of_length(['a','b','c'], range(2,4)),

         subsets_of_length(['d','e'], range(0,2)),

     ):

         print(' '.join(str(subset) for subset in choices))


('a', 'b') ()

('a', 'b') ('d',)

('a', 'b') ('e',)

('a', 'c') ()

('a', 'c') ('d',)

('a', 'c') ('e',)

('b', 'c') ()

('b', 'c') ('d',)

('b', 'c') ('e',)

('a', 'b', 'c') ()

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

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

但是我们想将这些元组链接在一起。因此我们应该这样做


>>>> for choices in map(chain.from_iterable,product(

         subsets_of_length(['a','b','c'], range(2,4)),

         subsets_of_length(['d','e'], range(0,2)),

     )):

         print(' '.join(column for column in choices if column))


a b

a b d

a b e

a c

a c d

a c e

b c

b c d

b c e

a b c

a b c d

a b c e

您编辑的问题案例的代码是:


for choices in map(chain.from_iterable,product(

    subsets_of_length(['AA','AS','AD'], [1]),       #only one of these

    subsets_of_length(['BB','BC'], [1,2]),          #at least one of these

    subsets_of_length(['CD','CF','CG'], [0,1,2,3]), #All, 1, 2 or none of these

)):

    print(' '.join(column for column in choices if column))


查看完整回答
反对 回复 2021-09-11
  • 3 回答
  • 0 关注
  • 186 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信