【问题标题】:Iterate all combination in Python在Python中迭代所有组合
【发布时间】:2020-06-05 16:45:35
【问题描述】:

我是 Python 的初学者,想提高解决问题的能力,但我卡在这里

这是我的简单代码

import itertools

a = [1, 2, 3] 
b = [2, 3, 1] 
c = [3, 1, 2] 

p = ["Number {x} ,number {y} and number {z}"]

for phrase in p:
  for (x, y, z) in zip(a, b, c):
    t = phrase.format(x=x, y=y, z=z)
    print(t)

和输出

Number 1, number 2 and number 3
Number 2, number 3 and number 1
Number 3, number 1 and number 2

我的问题是如何获得一个列表的所有可能组合并通过 x、y、z 迭代它?而不是手动操作

例如这是我的一个列表

a = [1, 2, 3]

输出是列表的组合(通过变量p中的x,y,z)

Number 1, number 2 and number 3
Number 1, number 3 and number 2
Number 2, number 1 and number 3
Number 2, number 3 and number 1
Number 3, number 1 and number 2
Number 3, number 2 and number 1

提前谢谢你。

【问题讨论】:

标签: python iteration combinations


【解决方案1】:

您的问题主要基于如何生成列表的所有排列,而与该列表中元素的类型无关。在 Python 中有一个名为 itertools 的标准库工具。按照你自己的代码结构,下面是如何解决它:

from itertools import permutations

a = [1, 2, 3]
p = ["Number {x}, number {y} and number {z}"]

for phrase in p:
    for (x, y, z) in permutations(a):
        t = phrase.format(x=x, y=y, z=z)
        print(t)

还有输出:

Number 1, number 2 and number 3
Number 1, number 3 and number 2
Number 2, number 1 and number 3
Number 2, number 3 and number 1
Number 3, number 1 and number 2
Number 3, number 2 and number 1

备注:从上面的函数itertools.permutations()可以注意到一件事,就是顺序很重要。但是,如果您想了解置换的工作原理,这里有一个实现示例,没有任何库,仅利用置换的递归性质:

def all_perms(items_list):
    if len(items_list) <=1:
        yield items_list
    else:
        for item in all_perms(items_list[1:]): # Recursivity
            for i in range(len(items_list)):
                yield item[:i] + items_list[0:1] + item[i:]

这是输出(顺序无关紧要):

Number 1, number 2 and number 3
Number 2, number 1 and number 3
Number 2, number 3 and number 1
Number 1, number 3 and number 2
Number 3, number 1 and number 2
Number 3, number 2 and number 1

注意:此函数all_perms() 以及itertools.permutations() 可在字符串和列表上下文中使用。

【讨论】:

  • 很好地解释了它的工作原理,感谢您的帮助?
【解决方案2】:

这些序列将由itertools.permutations生成

for x,y,z in itertools.permutations(a):
    print(f"Number {x}, number {y} and number {z}")

输出

Number 1, number 2 and number 3
Number 1, number 3 and number 2
Number 2, number 1 and number 3
Number 2, number 3 and number 1
Number 3, number 1 and number 2
Number 3, number 2 and number 1

【讨论】:

    【解决方案3】:

    只是@Cory Kramer 答案的快速补充,如果您想一次从列表中选择多个项目,您可以将数字作为第二个参数传递给方法 permutations,执行以下操作:

    from itertools import permutations
    a = [1, 2, 3]
    selection = 2
    for x in permutations(a, selection):
        print(x)
    
    

    输出:

    (1, 2)
    (1, 3)
    (2, 1)
    (2, 3)
    (3, 1)
    (3, 2)
    

    【讨论】:

      【解决方案4】:

      如果你想编写自己的函数来计算排列,你可能会得到这样的结果,你循环所有可能的项目放在第一位,然后递归地回调同一个函数以获得可能的其余项目的排列。

      def get_permutations(lst):
          n = len(lst)
          if n == 1:
              return [lst]
          perms = []
          for orig_index, value in enumerate(lst):
              others = lst[:orig_index] + lst[orig_index + 1:]
              for perm_of_others in get_permutations(others):
                  perms.append([value] + perm_of_others)
          return perms
      
      for a, b, c in get_permutations([1, 2, 3]):
          print(f"Number {a}, number {b} and number {c}")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-26
        • 2021-09-24
        相关资源
        最近更新 更多