元组列表与替代值的组合

时间:2019-05-24 09:07:27

标签: python

我定义了一个字典,该字典给出了元组的其他选择列表:

d = {(2, 1): [(2, 1)],
     (1, 2): [(1, 2)],
     (2, 0.5): [(2, 1), (2, 0.5)],
     (0.5, 2): [(0.5, 2), (1, 2)],
     (0.5, 0.5): [(0.5, 0.5), (1, 1), (0.5, 1), (1, 0.5)],
     (1, 1): [(1, 1), (0.5, 0.5)]}

例如:

  • 每个元组(1, 1)可以是(1, 1)(0.5, 0.5)
  • 每个元组(2, 1)只能是(2, 1)

我也有一个元组列表(此列表中的每个元组始终是字典d的键)。例如:

lst = [(2, 1), (1, 1), (1, 1)]

我想使用字典d提供的替代值列出此列表的所有替代项。 例如,lst的替代方案将是:

[(2, 1), (1, 1), (1, 1)]
[(2, 1), (0.5, 0.5), (0.5, 0.5)]
[(2, 1), (0.5, 0.5), (1, 1)]
[(2, 1), (1, 1), (0.5, 0.5)]

我确定我可以使用itertools和lambdas来做到这一点,但暂时没有找到任何解决方案。

1 个答案:

答案 0 :(得分:3)

您可以使用itertools product获得所需的输出。

d = {(2, 1): [(2, 1)],
     (1, 2): [(1, 2)],
     (2, 0.5): [(2, 1), (2, 0.5)],
     (0.5, 2): [(0.5, 2), (1, 2)],
     (0.5, 0.5): [(0.5, 0.5), (1, 1), (0.5, 1), (1, 0.5)],
     (1, 1): [(1, 1), (0.5, 0.5)]}

lst = [(2, 1), (1, 1), (1, 1)]

from itertools import product
result = list(product(*(d[k] for k in lst)))

这将产生一个元组列表。如果您希望将所有值都作为列表,则可以通过这种方式进行迭代和访问。

for val in result:
    print(list(val))

#Output:
[(2, 1), (1, 1), (1, 1)]
[(2, 1), (1, 1), (0.5, 0.5)]
[(2, 1), (0.5, 0.5), (1, 1)]
[(2, 1), (0.5, 0.5), (0.5, 0.5)]