首页 > 解决方案 > 如何将组合一组数字列表的所有可能性与 Python 中请求的数字列表进行比较?

问题描述

我有这个列表列表,其中包含字典:

[ 
    [{'A': [35, 64, 72]}, {'B': [42, 55, 23]}, {'C': [17, 23, 55]}],
    [{'A': [35, 64, 72]}, {'B': [42, 55, 23]}, {'C': [17, 23, 55]}],
    [{'D': [72]}, {'E': [42]}]
]

我还有另一个列表,请求列表,看起来像这样:

[35, 64, 72, 42, 17, 23, 55]

我想要实现的是能够遍历可用的数字组合,看看是否有字母组合与请求的列表匹配。

所以在这种情况下,我希望输出是

['A', 'C', 'E']

因为如果我将它们组合在一起,我会得到一个与请求列表具有相同数字的列表。

我真的希望我能正确解释这一点,如果这是已经问过的简单问题,我很抱歉。我找不到任何关于它的信息,但也许我以错误的方式描述了我的问题。

任何将不胜感激!我卡住了。。

标签: python

解决方案


OP 在此问题下方的评论中添加了要求。尽管相关,但它已被充分改变,我决定保留此答案(以回答所示问题)并添加与该案例相关的单独答案。



问题分为两部分。

  1. 将输入数据转换为更方便的格式:
data_in = [ 
    [{'A': [35, 64, 72]}, {'B': [42, 55, 23]}, {'C': [17, 23, 55]}],
    [{'A': [35, 64, 72]}, {'B': [42, 55, 23]}, {'C': [17, 23, 55]}],
    [{'D': [72]}, {'E': [42]}]
]

target_list = [35, 64, 72, 42, 17, 23, 55]

data = {}
for sublist in data_in:
    for dct in sublist:
        data.update({k: set(v) for k, v in dct.items()})

target = set(target_list)
        
print(data)
# {'A': {64, 72, 35}, 'B': {42, 23, 55}, 'C': {17, 55, 23}, 'D': {72}, 'E': {42}}

print(target)
# {64, 35, 72, 42, 17, 55, 23}
  1. 完成后,解决了有趣的问题。这可以通过递归方法来完成:
def find_combos(target, items):
    for i, (k, v) in enumerate(items):
        if not (v - target):
            remaining = target - v
            if remaining:                
                for lst in find_combos(remaining, items[i + 1 :]):
                    yield [k] + lst
            else:
                yield [k]


for combo in find_combos(target, list(data.items())):
    print(combo)

印刷:

['A', 'C', 'E']

推荐阅读