首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与字典相关的列表的不同组合

与字典相关的列表的不同组合
EN

Stack Overflow用户
提问于 2019-12-21 23:27:59
回答 3查看 39关注 0票数 1

假设我有一份清单

代码语言:javascript
复制
my_list = [a, b, c]

和一本字典

代码语言:javascript
复制
my_dict = dict({a:a_prime, b:b_prime, c:c_prime})

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

代码语言:javascript
复制
  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。如果只返回其中的一个就好了。

EN

回答 3

Stack Overflow用户

发布于 2019-12-21 23:41:30

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

代码语言:javascript
复制
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']]

如果您只想要唯一的值,只需使用一个集合:

代码语言:javascript
复制
uniques = set(tuple(combination) for combination in magic(['a', 'b', 'c']))
票数 3
EN

Stack Overflow用户

发布于 2019-12-21 23:39:28

您可以对生成器使用递归:

代码语言:javascript
复制
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)))

输出:

代码语言:javascript
复制
[['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']]
票数 1
EN

Stack Overflow用户

发布于 2019-12-21 23:56:51

代码语言:javascript
复制
my_list = ["a", "b", "c"]
my_dict = dict({"a": "a_prime", "b": "b_prime", "c": "c_prime"})

从上面的例子中,我注意到您不希望在相同的输出中有键值对,所以我们通过创建集合来分隔它们。在创建我们的集合时,我们将为每个可能的组合选择key或value。

代码语言:javascript
复制
my_coll = [[key, my_dict[key]] for key in my_list]

Output:
>> [['a', 'a_prime'], ['b', 'b_prime'], ['c', 'c_prime']]

最后,我们可以使用itertools产品来获得示例中提到的描述输出。

代码语言:javascript
复制
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']]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59437449

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档