代码之家  ›  专栏  ›  技术社区  ›  m1nkeh

将每个列表元素与唯一的状态组合配对

  •  -1
  • m1nkeh  · 技术社区  · 6 年前

    我试着用一些我认为微不足道的东西来学习一点python 3,但实际上是让我有点紧张。。

    我有两张单子。。

    items=['a','b','c']
    states=[0, 1, -1]
    

    我想生成 状态 ,这些物品可以有。。。所以在这个例子中,它会以。。

     1, 1, 1
     1, 1, 0
     1, 1,-1
     ..
    

    注意 :排序很重要,1、0、0与0、1、0不同

    然后,如果我们再添加一个项目,它最终将是。。

     1, 1, 1, 1
     1, 1, 1, 0
     1, 1, 1,-1
     ..
    

    我现在对语法有点失望,我不太确定什么是可能的,但是我一直在尝试使用itertools.permutations和“generator”的概念??

    所以,我开始试图得到各州的排列。。

    itertools.permutations(states)
    [(0, 1, -1), (0, -1, 1), (1, 0, -1), (1, -1, 0), (-1, 0, 1), (-1, 1, 0)]
    

    然后把它们和项目列表联系起来。。

    [(x,items) for x in itertools.permutations(states)]
    [((0, 1, -1), ['a', 'b', 'c']), ((0, -1, 1), ['a', 'b', 'c']), ((1, 0, -1), ['a', 'b', 'c']), ((1, -1, 0), ['a', 'b', 'c']), ((-1, 0, 1), ['a', 'b', 'c']), ((-1, 1, 0), ['a', 'b', 'c'])]
    

    但所有这些都是随机的状态列表,我现在有一个列表。。i、 e.我没有1,1,1或0,0,0

    有人能给我指点一下吗。。我相信这一定是以前做过的!

    1 回复  |  直到 6 年前
        1
  •  1
  •   andrew_reece    6 年前

    你可能在找 itertools.product :

    from itertools import product
    
    [list(zip(x, item)) for x in product(states, repeat=3)]
    
    [[(0, 'a'), (0, 'b'), (0, 'c')],
     [(0, 'a'), (0, 'b'), (1, 'c')],
     [(0, 'a'), (0, 'b'), (-1, 'c')],
     [(0, 'a'), (1, 'b'), (0, 'c')],
     [(0, 'a'), (1, 'b'), (1, 'c')],
     [(0, 'a'), (1, 'b'), (-1, 'c')],
     [(0, 'a'), (-1, 'b'), (0, 'c')],
     [(0, 'a'), (-1, 'b'), (1, 'c')],
     [(0, 'a'), (-1, 'b'), (-1, 'c')],
     [(1, 'a'), (0, 'b'), (0, 'c')],
     [(1, 'a'), (0, 'b'), (1, 'c')],
     [(1, 'a'), (0, 'b'), (-1, 'c')],
     [(1, 'a'), (1, 'b'), (0, 'c')],
     [(1, 'a'), (1, 'b'), (1, 'c')],
     [(1, 'a'), (1, 'b'), (-1, 'c')],
     [(1, 'a'), (-1, 'b'), (0, 'c')],
     [(1, 'a'), (-1, 'b'), (1, 'c')],
     [(1, 'a'), (-1, 'b'), (-1, 'c')],
     [(-1, 'a'), (0, 'b'), (0, 'c')],
     [(-1, 'a'), (0, 'b'), (1, 'c')],
     [(-1, 'a'), (0, 'b'), (-1, 'c')],
     [(-1, 'a'), (1, 'b'), (0, 'c')],
     [(-1, 'a'), (1, 'b'), (1, 'c')],
     [(-1, 'a'), (1, 'b'), (-1, 'c')],
     [(-1, 'a'), (-1, 'b'), (0, 'c')],
     [(-1, 'a'), (-1, 'b'), (1, 'c')],
     [(-1, 'a'), (-1, 'b'), (-1, 'c')]]
    

    或者,还有 combinations_with_replacement() :

    from itertools import combinations_with_replacement
    
    [list(zip(x, item)) for x in combinations_with_replacement(states, 3)]
    
    [[(0, 'a'), (0, 'b'), (0, 'c')],
     [(0, 'a'), (0, 'b'), (1, 'c')],
     [(0, 'a'), (0, 'b'), (-1, 'c')],
     [(0, 'a'), (1, 'b'), (1, 'c')],
     [(0, 'a'), (1, 'b'), (-1, 'c')],
     [(0, 'a'), (-1, 'b'), (-1, 'c')],
     [(1, 'a'), (1, 'b'), (1, 'c')],
     [(1, 'a'), (1, 'b'), (-1, 'c')],
     [(1, 'a'), (-1, 'b'), (-1, 'c')],
     [(-1, 'a'), (-1, 'b'), (-1, 'c')]]