python - 从列表列表中选择三个列表的最有效方法,使得所有列表中唯一元素的数量组合大于阈值
问题描述
找出是否可以从列表列表中选择三个列表以使所有列表中唯一元素的数量组合大于某个特定数字的最有效方法是什么?我能想出的最佳解决方案是蛮力:
def maximum_number_of_unique_elements(mylist, threshold):
for a in range(len(mylist)):
for b in range(a,len(mylist)):
for c in range(b,len(mylist)):
if len(set(mylist[a] + mylist[b] + mylist[c])) >= threshold:
return True
return False
例子:
l = [[0,1,2],[0,1],[0,3,6],[3,7],[4,7]]
t = 7
maximum_number_of_unique_elements(l,t)
返回True
,因为通过选择列表创建0,2,4
了一个带有数字的集合0,1,2,3,4,6,7
。
解决方案
一个更简单的解决方案是使用itertools.combinations_with_replacement
,它允许在不更改代码的情况下设置要使用的列表数量(不是for
每个列表的循环)
from itertools import combinations_with_replacement, chain
def maximum_number_of_unique_elements(values, threshold, nb_list=3):
for parts in combinations_with_replacement(values, r=nb_list):
if len(set(chain.from_iterable(parts))) >= threshold:
return True
return False
combinations_with_replacement
每个元素都可以重复,用来combinations
获取唯一元素
print(list(combinations('ABC', r=2)))
# [('A', 'B'), ('A', 'C'), ('B', 'C')]
print(list(combinations_with_replacement('ABC', r=2)))
# [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
推荐阅读
- node.js - JWT 身份验证授权不起作用
- python - •选择一个有效的选项。该选择不是可用的选择之一
- firebase - 无法使用 Flutter Web 访问 Cloud Firestore
- python - 尝试下载 pdf 文件时崩溃
- pandas - 我如何比较熊猫中的值并更改值
- python - Python从字体列表中导入字体
- spring-boot - 禁用是真的,但我可以编辑字段
- sql - 如何连接 2 个不同的数字以使其看起来像小数但实际上是 varchar 而不会丢失小数部分的位置?
- wcf - 提供的 URI 方案“http”无效;预期的“https”。参数名称
- amazon-web-services - 使用 json_query 提取 2 个变量