これが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
(最終配列)を除いて、大きな配列を(最終配列)に一度も小さくせずに追加したい
私のコードは何をするはずでしたか?それは最初から最後まで行くように、要素はk個の要素を含み、その逆Nかどうかを検出するためにARR1通過し、互いに異なる要素に対向するようになっていた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]
実際にはの一部で[111, 222, 333, 444, 555, 777, 888]
あるものを削除することは可能ですが、よりエレガントな方法が必要です。
それで、別のリストにもある要素のみを含むすべてのリストを削除しようとしていますか?
def eachMasterList(allLists):
allSets = [ set(lst) for lst in allLists ]
for lst, s in zip(allLists, allSets):
if not any(s is not otherSet and s < otherSet for otherSet in allSets):
yield lst
この関数を使用するには、次のことを試してください。
print(list(eachMasterList([[1, 2, 3], [4, 5, 6], [1, 2, 3, 4, 5, 6], [7,8], [9, 10, 11, 12], [7, 8, 9, 10, 11, 12]])))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加