假设我有一个列表
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]]
也具有独特的 im 收费:
我认为[a_prime,b,c],[b,c,a_prime]是相等的,即顺序不数学。
并且可能是某些组合是相同的,例如 [a_prime, b, c] 也相等 [a, b_prime, c_prime]。如果只返回其中之一就好了。
您可以创建所有可能的掩码来判断我们是否在字典中选择键或相应的值:
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']))
您可以将递归与生成器一起使用:
my_list = ['a', 'b', 'c']
def combos(d, c = []):
if len(c) == len(my_list):
yield c
elif d:
yield from combos(d[1:], c+[d[0]])
yield from combos(d[1:], c+[f'{d[0]}_prime'])
print(list(combos(my_list)))
输出:
[['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']]
my_list = ["a", "b", "c"]
my_dict = dict({"a": "a_prime", "b": "b_prime", "c": "c_prime"})
从上面的例子中,我注意到你不希望在同一输出中有键值对,所以我们通过创建集合来分隔它们。 在创建集合时,我们将为每个可能的组合选择键或值。
my_coll = [[key, my_dict[key]] for key in my_list]
Output:
>> [['a', 'a_prime'], ['b', 'b_prime'], ['c', 'c_prime']]
最后,我们可以使用 itertools 产品来获取您的示例中提到的预期输出。
from itertools import product
combinations = [list(x) for x in product(*my_coll)]
Output:
>> [['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']]