python - Python:查找具有最大总不同值的元组
问题描述
我有一个整数元组列表。
我想返回一个包含这些元组中的一些(或全部)的新列表,这样整数的总数是最大的,并且没有重复单个整数。
my_tuples = [(1,2), (2,3,4), (1,2,3,4), (3,4,5,6), (4,5), (8,9)]
getGreatestCoverage(my_tuples)
# expected output is [(1,2), (3,4,5,6), (8,9)]
注意。上面提到的“预期输出”一共包含8个整数,没有重复的整数。我可以通过将要输出的元组数限制为 2 来达到预期的结果:
def getGreatestCoverage_for_2_tuples(my_tuples):
max_cover = 0
for idx1, item1 in enumerate(my_tuples):
for item2 in my_tuples[idx1+1:]:
coverage = len(set(item1 + item2))
if coverage >= max_cover:
max_cover = coverage
greatest_coverage = (item1, item2)
如果目标是正好返回 2 个元组,这很好用。如果目标是准确返回 3 个元组,则可以添加另一个内部 for 循环。这不满足意图,因为我希望允许任意数量的元组作为可能的输出。
解决方案
我不知道这是否是最优雅的解决方案,但它是我现在唯一的一个:
import itertools
#a = [(1,2), (2,3,4), (1,2,3,4), (3,4,5,6), (4,5), (8,9)]
#a = [(1,), (2,), (3,), (4,), (5,), (5,6), (6,7), (8,), (9, 10)]
a = [(0, 1, 2), (0,1), (1,2), (3,4), (4,5)]
def find_largest_group(x):
max_ = 0
max_len = max(map(max, x)) - min(map(min, x)) + 1
for i in range(1, len(x)+1):
b = itertools.combinations(x, i)
for tups in b:
m = len(set.union(*map(set, tups)))
if m==len(tuple(itertools.chain.from_iterable(tups))):
if m==max_len:
max_tups = tups
break
else:
if m > max_:
max_ = m
max_tups = tups
return max_tups
输出:
In [68]: find_largest_group(a)
Out[68]: ((0, 1, 2), (3, 4))
推荐阅读
- javascript - 过滤具有可观察条件的观察数组
- php - 在 symfony 项目中实现搜索功能的正确方法?
- javascript - array.join - 未定义新变量
- c++ - C++ 中的 delete[] 运算符无法正常工作
- ios - 在 UIView 中嵌入 UITableView
- security - 不安全的路由器是否会绕过 VPN 连接的隐私保证?
- sse - 在 SSE 和 AVX512 寄存器之间移动数据?
- postgresql - 如何查看postgresql data/base/dboid表的内容
- java - SpringBoot @ControllerAdvice 部分工作
- google-bigquery - jOOQ 是否将支持 Teradata 查询转换为 BigQuery 查询