【问题标题】:Get all possible combinations of variables/arguments in Python but always including all variables在 Python 中获取所有可能的变量/参数组合,但始终包括所有变量
【发布时间】:2019-06-25 01:59:23
【问题描述】:

我想编写一个 Python 脚本,提供一些变量和参数的所有可能组合,但始终在结果中包含所有变量。

我已经尝试了一些尝试,但我能得到的最接近的实际上是所有组合。例如,假设 a、b、c、d 和 e 可以为真或假。我想要所有可能的组合,但重要的是我每次都试图包含所有这些变量。因此,以下两个示例在结果中是有效的: a:真,b:假,c:假,d:假,e:假 a:true, b:true, c:false, d:false, e:false(注意b不同)

但以下不是我想要的: a:真,c:假

我想要所有可能的组合,但总是包括 a-e。

Martijn Pieters 已经提供了一个答案,这基本上是我想要的减去所有变量都表示的要求 (Find all possible combinations of arguments in Python)。以下是 Pieters 的代码:

from itertools import product

for combo in product((None, True, False), repeat=3):
    arguments = {k: v for k, v in zip('abc', combo) if v is not None}
    print arguments

>>> from itertools import product
>>> for combo in product((None, True, False), repeat=3):
...     arguments = {k: v for k, v in zip('abc', combo) if v is not None}
...     print arguments
... 
{}
{'c': True}
{'c': False}
{'b': True}
{'c': True, 'b': True}
{'c': False, 'b': True}
{'b': False}
{'c': True, 'b': False}
{'c': False, 'b': False}
{'a': True}
{'a': True, 'c': True}
{'a': True, 'c': False}
{'a': True, 'b': True}
{'a': True, 'c': True, 'b': True}
{'a': True, 'c': False, 'b': True}
{'a': True, 'b': False}
{'a': True, 'c': True, 'b': False}
{'a': True, 'c': False, 'b': False}
{'a': False}
{'a': False, 'c': True}
{'a': False, 'c': False}
{'a': False, 'b': True}
{'a': False, 'c': True, 'b': True}
{'a': False, 'c': False, 'b': True}
{'a': False, 'b': False}
{'a': False, 'c': True, 'b': False}
{'a': False, 'c': False, 'b': False}
'''

忽略 None 选项,这几乎正是我一直在尝试做的,但在这个例子中,我不想只返回 a 是假的。我希望它返回更少的组合,因为应该始终包含 a、b 和 c。我想从中得到的只是它们是真是假的组合。

修改此示例以获得正确结果的最佳方法是什么?还是您推荐一种完全不同的方法?非常感谢。

【问题讨论】:

  • 只需从 product 的第一个参数的元组中删除 None:for combo in product((True, False), repeat=3)。下一行不再需要“如果 v 不是无”,但保留它不会有任何影响,因为 v 永远不会是无。
  • 这里没有回答吗? stackoverflow.com/questions/464864/…

标签: python combinations itertools


【解决方案1】:

由于这只是一个二进制计数器,因此您不需要 itertools:

params = "abcd"
N      = len(params)
combos = [{params[p]:n&(1<<p)>0 for p in range(N)} for n in range(1<<N)] 

[{'a': False, 'b': False, 'c': False, 'd': False}, 
 {'a': True,  'b': False, 'c': False, 'd': False}, 
 {'a': False, 'b': True,  'c': False, 'd': False}, 
 {'a': True,  'b': True,  'c': False, 'd': False}, 
 {'a': False, 'b': False, 'c': True,  'd': False}, 
 {'a': True,  'b': False, 'c': True,  'd': False}, 
 {'a': False, 'b': True,  'c': True,  'd': False}, 
 {'a': True,  'b': True,  'c': True,  'd': False}, 
 {'a': False, 'b': False, 'c': False, 'd': True}, 
 {'a': True,  'b': False, 'c': False, 'd': True}, 
 {'a': False, 'b': True,  'c': False, 'd': True}, 
 {'a': True,  'b': True,  'c': False, 'd': True}, 
 {'a': False, 'b': False, 'c': True,  'd': True}, 
 {'a': True,  'b': False, 'c': True,  'd': True}, 
 {'a': False, 'b': True,  'c': True,  'd': True}, 
 {'a': True,  'b': True,  'c': True,  'd': True}]

我不得不承认,虽然使用 product 会更容易阅读(但这可能是一个见仁见智的问题):

params = "abcd"
N      = len(params)
combos = [{p:v for p,v in zip(params,c)} for c in product(*[(False,True)]*N)]

【讨论】:

    【解决方案2】:

    只需从可能的值中删除 None 并重复变量计数的数量:

    from itertools import product
    
    vars = 'abcde'
    for combo in product((True, False), repeat=len(vars)):
        arguments = {k: v for k, v in zip(vars, combo)}
        print( arguments )
    

    请注意,如果您保留repeat=3,您将只能获得 a-c 的结果。

    正如@Colin 提到的,您可以删除if v is not None,因为在这种情况下该值永远不会是None

    输出:

    {'e': True, 'd': True, 'b': True, 'c': True, 'a': True}
    {'e': False, 'd': True, 'b': True, 'c': True, 'a': True}
    {'e': True, 'd': False, 'b': True, 'c': True, 'a': True}
    {'e': False, 'd': False, 'b': True, 'c': True, 'a': True}
    {'e': True, 'd': True, 'b': True, 'c': False, 'a': True}
    {'e': False, 'd': True, 'b': True, 'c': False, 'a': True}
    {'e': True, 'd': False, 'b': True, 'c': False, 'a': True}
    {'e': False, 'd': False, 'b': True, 'c': False, 'a': True}
    {'e': True, 'd': True, 'b': False, 'c': True, 'a': True}
    {'e': False, 'd': True, 'b': False, 'c': True, 'a': True}
    {'e': True, 'd': False, 'b': False, 'c': True, 'a': True}
    {'e': False, 'd': False, 'b': False, 'c': True, 'a': True}
    {'e': True, 'd': True, 'b': False, 'c': False, 'a': True}
    {'e': False, 'd': True, 'b': False, 'c': False, 'a': True}
    {'e': True, 'd': False, 'b': False, 'c': False, 'a': True}
    {'e': False, 'd': False, 'b': False, 'c': False, 'a': True}
    {'e': True, 'd': True, 'b': True, 'c': True, 'a': False}
    {'e': False, 'd': True, 'b': True, 'c': True, 'a': False}
    {'e': True, 'd': False, 'b': True, 'c': True, 'a': False}
    {'e': False, 'd': False, 'b': True, 'c': True, 'a': False}
    {'e': True, 'd': True, 'b': True, 'c': False, 'a': False}
    {'e': False, 'd': True, 'b': True, 'c': False, 'a': False}
    {'e': True, 'd': False, 'b': True, 'c': False, 'a': False}
    {'e': False, 'd': False, 'b': True, 'c': False, 'a': False}
    {'e': True, 'd': True, 'b': False, 'c': True, 'a': False}
    {'e': False, 'd': True, 'b': False, 'c': True, 'a': False}
    {'e': True, 'd': False, 'b': False, 'c': True, 'a': False}
    {'e': False, 'd': False, 'b': False, 'c': True, 'a': False}
    {'e': True, 'd': True, 'b': False, 'c': False, 'a': False}
    {'e': False, 'd': True, 'b': False, 'c': False, 'a': False}
    {'e': True, 'd': False, 'b': False, 'c': False, 'a': False}
    {'e': False, 'd': False, 'b': False, 'c': False, 'a': False}
    

    【讨论】:

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