次の入力リストがあります
A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]
長さが 2 のサブリストが必要です。上記の例では、[A,[1,2,3]]、[F,[1]] などを削除します。新しいリストを作成し、そのすべてのサブリストを追加します。長さ ==2。不要なサブリストである A から直接削除できれば理想的です
こんなはずじゃないの?
A = [x for x in A if len(x[1]) == 2]
あるいは
A = [[a, b] for a, b in A if len(b) == 2]
新しいフィルタリングされたリストを作成する方が簡単です。はスライス割り当てです。これは、同じリストへの他の参照が更新を参照できるようA[:] = ...
に、新しいリストのコンテンツがコピーされて戻されることを意味します。A
のIDを保持する必要がない場合はA
、A = ...
>>> A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]
>>> A[:] = [x for x in A if len(x[1]) == 2]
>>> A
[['D', [3, 4]], ['E', [6, 7]]]
アイテムを削除するたびに残りのアイテムをリストの下に移動する必要があるため、通常、その場で削除するのは非効率的です。また、繰り返し処理するリストから削除するときに、要素をスキップしないように注意する必要があります。
フィルターを使用したい場合があります。
filter(lambda x: len(x[1]) == 2, A)
これは、各要素 (リスト) に 2 つの要素があり、2 番目の要素がリストであることを前提としています。この内部リストにちょうど 2 つの要素を持つ要素をフィルター処理したいとします。
フィルターの詳細:
filter(...) filter(関数またはなし、シーケンス) -> リスト、タプル、または文字列
Return those items of sequence for which function(item) is true.
[x for x in A if len(x[1]) == 2]
A = [x if len(x)==2 for x in A]
参考までに、E リストと F リストには閉じ括弧がありませんが、これは単なるコピー/貼り付けエラーまたは同様のものだと思います。