以下是我的Python代码,用于检查大数组中的小子数组是否在其中一个子数组内。我不知道最大子数组的索引是哪个,所以无法对索引进行比较。也许对它们进行排序是一种好方法。但如果有多个大型子数组怎么办?
即我希望在最终数组中只包含包含较小子数组的大子数组。
我希望输出的结果为:
由于有很多好的问题,我需要添加更多细节。
1)有一个数组的数组:
[[1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]
其次,如果元素的顺序可以随机,该怎么办?例如:
[[1, 3, 2], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]
这是我的代码:arr1 = [[1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]
arr2 = []
arrInd = 0
arrInd2 = len(arr1)
for k in arr1:
for n in reversed(arr1):
if set(n).issubset(set(k)):
arr2.append(k)
print(arr2)
我希望输出的结果为:
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]]
,但是我却得到了:[[4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [7, 8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12], [7, 8, 9, 10, 11, 12]]
更新由于有很多好的问题,我需要添加更多细节。
1)有一个数组的数组:
arr1 = [[]]
2)它包含了一些子数组,比如这些:[1, 2, 3],[4, 5, 6],[4, 6, 5],[7, 8, 9, 10, 11, 12],[11, 12, 13, 14, 15],[1, 2, 3, 4, 5, 6],[7, 8, 9, 10, 11, 12, 13, 14, 15],[111, 222, 333],[444, 555],[777, 888],[111, 222, 333, 444, 555],[111, 222, 333, 444, 555, 777, 888],[1000, 2000, 3000]
可能出现的情况:
1)数组内部的顺序可能会变化:[4, 5, 6], [4, 6, 5]
和 [1, 2, 3, 4, 5, 6]
,所以它们不是按数字顺序排列的,实际数据中(我正在测试)甚至可能会有字母,比如 A77
,B81
;
2)有大大小小的数组,总是有一个最大的数组(或者几个),它从不与其他最大的数组相交,所以这里的 [1, 2, 3, 4, 5, 6]
和 [7, 8, 9, 10, 11, 12, 13, 14, 15]
- 它们不能相互交叉,但它们包含一些小的子数组;
3)每个大的子数组都包含一些较小的子数组。但并不是所有的子数组都存在,有些小的子数组可以独立存在。例如:[1, 2, 3, 4, 5, 6]
包含 [1, 2, 3],[4, 5, 6],[4, 6, 5]
,但它不包含 [7, 8, 9, 10, 11, 12],[11, 12, 13, 14, 15]
或者 [111, 222, 333]
;
4)还可能存在中间的“大数组”:[111, 222, 333, 444, 555]
相对于 [111, 222, 333, 444, 555, 777, 888]
来说更小,所以第一个 [111, 222, 333, 444, 555]
必须被排除。
5*)我想将大数组添加到 arr2
(最终数组)中,而不包括小数组,除了情况 *** [1000, 2000, 3000]
,将其添加到 arr2
(最终数组)中。
我的代码应该做什么?
它应该遍历arr1,并将不同的元素相对比,以便检测n元素是否包含k元素,反之亦然, 当它从开始到结束时使用for k in arr1:
,当它从结尾到开头时使用for n in reversed(arr1):
更新2. 长度比较!
if len(n) < len(k):
for k in arr1:
for n in reversed(arr1):
if len(n) < len(k):
if set(n).issubset(set(k)):
arr2.append(k)
它非常接近,实际上几乎就是它了,但根据重复的数量来判断,似乎顺序问题(1)根本不是问题:
arr2 = [[1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12, 13, 14, 15], [7, 8, 9, 10, 11, 12, 13, 14, 15], [111, 222, 333, 444, 555], [111, 222, 333, 444, 555], [111, 222, 333, 444, 555, 777, 888], [111, 222, 333, 444, 555, 777, 888], [111, 222, 333, 444, 555, 777, 888], [111, 222, 333, 444, 555, 777, 888]]
当然,可以开始去除重复项,再以这种方式运行arr2,以摆脱实际上是[111, 222, 333, 444, 555, 777, 888]
一部分的[111, 222, 333, 444, 555]
,但肯定有更加优雅的方法。