首页 > 解决方案 > 列表相对于字典的不同组合

问题描述

假设我有一个清单

my_list = [a, b, c]

和一本字典

my_dict = dict({a:a_prime, b:b_prime, c:c_prime})

其中所有字母 letter_prime 都是整数。如何找到创建与字典相关的唯一列表的所有组合?在上面的示例中,我想要一个将 [a,b,c], my_dict 作为输入的函数

  magic_function([a,b,c], my_dict)
  .
  .
  .

   return [[a_prime, b, c], [a, b_prime, c], [a, b, c_prime], [a_prime, b_prime, c], [a_prime, b, c_prime], [a, b_prime, c_prime], [a_prime, b_prime, c_prime]]

也有独特的即时参考:

我认为 [a_prime,b,c], [b,c, a_prime] 是相等的,即顺序不重要。

并且可能是某些组合是相同的,例如 [a_prime, b, c] 结果也相等 [a, b_prime, c_prime]。如果只返回其中一个就好了。

标签: pythonlistdictionarycombinations

解决方案


您可以创建所有可能的掩码,告诉我们是否在 dict 中选择键或对应的值:

from itertools import product

my_dict = {'a': 'a_prime', 'b': 'b_prime', 'c': 'c_prime'}

def magic(keys):
    out = []
    for key_or_val in product([True, False], repeat=len(keys)):
        out.append([key if k_v else my_dict[key] for key, k_v in zip(keys, key_or_val)])
    return out

print(magic(['a', 'b', 'c']))
# [['a', 'b', 'c'], ['a', 'b', 'c_prime'], ['a', 'b_prime', 'c'], ['a', 'b_prime', 'c_prime'],
#  ['a_prime', 'b', 'c'], ['a_prime', 'b', 'c_prime'], ['a_prime', 'b_prime', 'c'],
# ['a_prime', 'b_prime', 'c_prime']]

如果您只想要唯一值,只需使用一组:

uniques = set(tuple(combination) for combination in magic(['a', 'b', 'c']))

推荐阅读