python - 如何将组合一组数字列表的所有可能性与 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']
因为如果我将它们组合在一起,我会得到一个与请求列表具有相同数字的列表。
我真的希望我能正确解释这一点,如果这是已经问过的简单问题,我很抱歉。我找不到任何关于它的信息,但也许我以错误的方式描述了我的问题。
任何将不胜感激!我卡住了。。
解决方案
OP 在此问题下方的评论中添加了要求。尽管相关,但它已被充分改变,我决定保留此答案(以回答所示问题)并添加与该案例相关的单独答案。
问题分为两部分。
- 将输入数据转换为更方便的格式:
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}
- 完成后,解决了有趣的问题。这可以通过递归方法来完成:
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']
推荐阅读
- sql - 频繁重新填充高度读取的数据库表是否会影响性能?
- authentication - 如何在 Keycloak 中使用手机号码对用户进行身份验证
- google-cloud-platform - 如何禁用 gcp pubsub 模拟器的消息加密?
- python - 在python中我想得到两个数字,重复第一个数字和第二个数字一样多
- postgresql - 检索存储在数据库 odoo 13 中的 product_template 图像
- python - 在 Django 中导入 Keras
- python - 使用 gRPC 联网
- javascript - 使用变量导入 JavaScript 模型
- python - 使用 python 抓取 url
- python - 使用 pymongo 更改流检索删除操作的完整删除文档