【问题标题】:Generate all combinations of an unknown number of variables生成未知数量变量的所有组合
【发布时间】:2020-05-30 01:18:44
【问题描述】:

我有一个变量列表,其中的数量可以改变。每个变量都有一个下限、上限和一个增量值。例如:

variables = {
   "a": [1, 10, 1],
   "b": [50, 200, 5],
   "c": [50, 300, 10]
}

其中键“a”,1为下限,10为上限,1为增量。

"a" would go from 1 through 10, incrementing by 1
"b" would go from 50 through 200, incrementing by 5
"c" would go from 50 through 300, incrementing by 10
... there can be more or less such keys.

我需要创建 a、b 和 c 的所有可能组合的列表,而无需硬编码嵌套循环,因为变量/键的数量未知,而且我无法理解它。我正在使用 Python 3.7

理想情况下,输出是每个变量的组合表,可能是逗号分隔的值。例如。

a  b  c
x  y  z
x  y  z
x  y  z
x  y  z

但是,只要我可以将输出整理成可以将每个组合作为一组访问的格式,任何事情都可以。比如元组列表。

[
  (x, y, z)
  (x, y, z)
]
...

【问题讨论】:

标签: python loops dynamic combinations


【解决方案1】:

这里,假设:

variables = {
   "a": [1, 10, 1],
   "b": [50, 200, 5],
   "c": [50, 300, 10]
}

然后你可以使用itertools创建一个迭代器:

from itertools import product, starmap
cartesian_product = product(*starmap(range, variables.values()))

或者,只是为了向您展示星图在做什么:

cartesian_product = product(*(range(*v) for v in variables.values()))

【讨论】:

  • 非常感谢!这里还有一个问题。 dict的源代码定义中的键顺序是否总是反映在元组元素的顺序中?还是您建议我使用 OrderedDict?
  • @SidKhullar 如果您使用的是 python 版本 >= 3.7 那么是的,它保持插入顺序。否则,它不会。
  • 我的一些值是浮点数,这会导致 TypeError。请问您能提出解决方案吗?
【解决方案2】:

试试:

import numpy as np
lst = [np.arange(v[0], v[1]+1, v[2]) for k,v in variables.items()]
np.array(np.meshgrid(*lst)).T.reshape(-1,len(lst))

【讨论】:

  • 谢谢。这似乎需要已知数量的变量。
  • 虽然这段代码可能会回答这个问题,但您是否可以考虑添加一些解释来说明您解决了什么问题,以及您是如何解决的?这将有助于未来的读者更好地理解您的答案并从中学习。
【解决方案3】:

试试这个方法:

var=[]
for k in variables.keys():
  var.append(np.arange(variables[k][0],variables[k][1]+1,variables[k][2]))

np.array(np.meshgrid(var[0],var[1],var[2])).T.reshape(-1,3)

对于组合我从here获得了帮助

【讨论】:

  • 这似乎需要已知数量的变量。
  • 你可以使用 for 循环 for np.arange
【解决方案4】:

你可以使用itertools:

import numpy as np
import itertools


a = np.arange(1, 10, 1)
b = np.arange(50, 200, 5)
c = np.arange(50,300,10)

results = itertools.product(a, b, c)
for item in results:
    print(item)

输出:

(1, 50, 50)
(1, 50, 60)
...
...
(9, 195, 270)
(9, 195, 280)
(9, 195, 290)

【讨论】:

  • @SidKhullar 如果这有帮助,如果你接受我的回答会很好:)
  • 这行得通,太好了,谢谢,但是如何使这部分动态化? results = itertools.product(a, b, c);特别是'a,b,c'?
  • @SidKhullar by dynamic 你的意思是设置不同的变量数或不同数量的数组?
  • 为什么在这里numpy?只需使用range
  • @juanpa.arrivillaga 你能分享一个代码 sn-p 我可以试试吗?
猜你喜欢
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-02
  • 2022-11-18
  • 2015-06-25
  • 2020-10-11
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多