【问题标题】:Get all the different combination from the lists (Python)?从列表中获取所有不同的组合(Python)?
【发布时间】:2019-04-07 04:37:58
【问题描述】:

我有以下两个字典:

a={"ad":["tau","guru"],
"bigd":["tau","guru"],
"lugd":["tau","guru"]}

b={"tau":["ad","bigd","lugd"],
"guru":["bigd","ad","lugd"]}

键的每个值都是键的优先顺序。我试图用python完成的是如何获得偏好顺序的所有可能组合。 因此,一种偏好顺序是,当您仅翻转键“ad”的值时,其余的将是相同的。如下所示

a={"ad":["guru", "tau"],
"bigd":["tau","guru"],
"lugd":["tau","guru"]}

b={"tau":["ad","bigd","lugd"],
"guru":["bigd","ad","lugd"]}

其他情况可能是“广告”偏好保持不变而“大”偏好不同。我们必须遍历两个字典中的所有列表并找到所有 2^3 * 3*2 的可能性。有人可以帮我吗?

【问题讨论】:

  • 你能发布一些代码来展示你到目前为止所做的尝试吗?这将有助于我们为您提供更好的答案。

标签: python list iterator iteration combinations


【解决方案1】:

您可以使用itertools获取它们:

from itertools import permutations, product

a_variants = [dict(zip(["ad", "bigd", "lugd"], values)) 
                 for values in product(permutations(["tau","guru"]), repeat=3)]
b_variants = [dict(zip(["tau", "guru"], values)) 
                 for values in product(permutations(["ad", "bigd", "lugd"]), repeat=2)]

all_variants = product(a_variants, b_variants)

for va, vb in all_variants:
    print("a:", va, "\nb:", vb, "\n")

输出:

a: {'ad': ('tau', 'guru'), 'bigd': ('tau', 'guru'), 'lugd': ('tau', 'guru')} 
b: {'tau': ('ad', 'bigd', 'lugd'), 'guru': ('ad', 'bigd', 'lugd')} 

a: {'ad': ('tau', 'guru'), 'bigd': ('tau', 'guru'), 'lugd': ('tau', 'guru')} 
b: {'tau': ('ad', 'bigd', 'lugd'), 'guru': ('ad', 'lugd', 'bigd')} 

...

a: {'ad': ('guru', 'tau'), 'bigd': ('guru', 'tau'), 'lugd': ('guru', 'tau')} 
b: {'tau': ('lugd', 'bigd', 'ad'), 'guru': ('lugd', 'ad', 'bigd')} 

a: {'ad': ('guru', 'tau'), 'bigd': ('guru', 'tau'), 'lugd': ('guru', 'tau')} 
b: {'tau': ('lugd', 'bigd', 'ad'), 'guru': ('lugd', 'bigd', 'ad')} 

请注意,您有 2**3 * (3*2)**2 = 288 个不同的输出。

【讨论】:

  • 感谢您的回答,但是当我执行 len(list(all_variants)) 时,我得到了 288 而不是 324。你能帮忙吗?
  • @kumar print(len(list(all_variants))) 为此确实得到了288
  • @kumar 相同的代码在这里运行得到你预期的288 可能性:repl.it/@downshift/SmugLonelyDevicedriver
  • @kumar 是的,当然,我在输入时弄混了,它是 2^3,而不是 a 的 3^2,所以总共 288,因为代码正确输出。我添加了此评论,因为您的问题中缺少 (3*2) 的 ^2。
  • @ThierryLathuille 是否也可以通过仅更改字典中每个键的前两个首选项来获得所有组合?因此,例如在字典 a 中,所有键只有两个首选项,但在字典 b 中,两个键都有三个首选项,因此我们只想更改前两个而不包括“lugd”。有一次可能是 b['guru'] -- ['ad, 'bigd', 'lugd']。只有前两个索引参与两个字典中所有键的排列。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多