【问题标题】:Create Permutations and Combinations of List in Python (Efficiently)在 Python 中创建列表的排列和组合(高效)
【发布时间】:2021-08-18 07:44:34
【问题描述】:

我想创建一个列表,其中包含满足特定条件的各种元素组合的每个排列。具体来说,我希望给定长度的每个列表都包含大部分零和一个或两个不同的元素,其中任何一个都可以是 1 或 -1。我写了以下内容,虽然有效,但速度很慢:

import itertools
slots = 12
all_choices = []
for elements in itertools.product(*[[-1,0,1] for ii in range(slots)]):
  if sum([abs(ii) for ii in elements]) in [1, 2]:
    all_choices.append(list(elements))
    

我设法使它更快一点:

slots = 12
all_choices = []
for first in [-1, 1]:
  for second in [-1, 1]:
    for ii in range(slots):
      for jj in range(ii, slots):
        choices = [0 for kk in range(slots)]
        choices[ii] = first
        choices[jj] = second
        if choices not in all_choices:
          all_choices.append(choices)

但这仍然感觉很笨拙,我相信有一种更有效/更清洁的方法可以利用itertools 来获得我想要的东西。有更好的方法吗?

【问题讨论】:

    标签: python python-2.7 combinations permutation itertools


    【解决方案1】:

    创建所有需要的更改(从一个全零列表)并应用它们:

    from itertools import combinations, product
    
    def all_choices(slots, maxchanges=2):
        for k in range(1, maxchanges+1):
            for I in combinations(range(slots), k):
                for V in product([-1, 1], repeat=k):
                    elements = [0] * slots
                    for i, v in zip(I, V):
                        elements[i] = v
                    yield elements
    

    例如print(*all_choices(3)) 打印这个:

    [-1, 0, 0] [1, 0, 0] [0, -1, 0] [0, 1, 0] [0, 0, -1] [0, 0, 1] [-1, -1, 0] [-1, 1, 0] [1, -1, 0] [1, 1, 0] [-1, 0, -1] [-1, 0, 1] [1, 0, -1] [1, 0, 1] [0, -1, -1] [0, -1, 1] [0, 1, -1] [0, 1, 1]
    

    注意maxchanges 参数,让您轻松请求不同数量的更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多