碰见一个问题,有一个大数组,如下所示:
xx = [[1, 3, 4], [3, 4, 5], [1, 2, 3, 4, 5], [6], [7, 8], [6, 7, 8]]
大数组里面有好多小的数组,观察发现,小的数组其实有挺多别的小数组的子集,现在问题来了,想看下这里的有多少个能把小数组代表的出来的并集组合。
翻译起来就是,上面的数组我想要出来[[1, 2, 3, 4, 5],[6, 7, 8]]。
其实就是排序整理一下就可以了。
# 定义一个二维数组,每个元素是一个小数组
xx = [[1, 3, 4], [3, 4, 5], [1, 2, 3, 4, 5], [6], [7, 8], [6, 7, 8]]
# 按照小数组的长度升序排序
sorted_array = sorted(xx, key=lambda x: len(x))
# 初始化一个空列表,用于存储符合条件的索引
xx_index = []
# 初始化一个标记数组,用于记录每个小数组是否被处理过
arr_index = [0] * len(sorted_array)
# 从排序后的数组的最后一个元素开始倒序遍历
for i in range(len(sorted_array) - 1, 0, -1):
# 如果当前元素未被标记为已处理
if arr_index[i] == 0:
# 遍历排序后的数组中的每一个元素
for j in range(len(sorted_array)):
# 如果 j 位置的元素未被处理,并且 j 位置的数组长度小于当前 i 位置的数组长度
# 并且 j 位置的数组是 i 位置数组的子集
if arr_index[j] == 0 and len(sorted_array[j]) < len(sorted_array[i]) and set(sorted_array[j]).issubset(set(sorted_array[i])):
# 标记 j 位置的数组为已处理
arr_index[j] = 1
# 将当前 i 位置的索引加入结果列表
xx_index.append(i)