2017-03-02 14 views
0

h行列からすべての値の出現を削除する方法は?

h=[[0,346,34,6,7,0,0,34634,6,0],[2352,205230,523,50,5023,502,350,0,0]] 

私の行列とすると、私はhからすべてのゼロを削除したいです。

だから、結果は次のようになります。

h=[[346,34,6,7,34634,6],[2352,205230,523,50,5023,502,350]] 

私はHEREと他の質問から、いくつかの異なるものを試してみましたが、何も行列のために動いていないようにみえます。そこにいい解決策はありますか?

+0

これは数字ですか? 'numpy'行列の場合は、' h'の代わりに ' – ZdaR

答えて

2

マトリクスのインプレースを変更する場合は、次のような機能を使用して変更できます。そのトリックは、各行の要素を逆方向に通過することで、前に削除された要素のために連続する要素のインデックスが変更されないようにします。

def remove_zeros(matrix): 
    for row in matrix: 
     length = len(row)-1 
     for i, elem in enumerate(reversed(row)): 
      if not elem: # zero value? 
       row.pop(length-i) 

h = [[0, 346, 34, 6, 7, 0, 0, 34634, 6, 0], [2352, 205230, 523, 50, 5023, 502, 350, 0, 0]] 

remove_zeros(h) 

print(h) # -> [[346, 34, 6, 7, 34634, 6], [2352, 205230, 523, 50, 5023, 502, 350]] 
+0

私は 'row [:: - 1]'の代わりに 'reversed(row)'を使うでしょう。 –

+0

@FelipeNardiBatista:それはうまくいくでしょう。しかし、ほとんどの "Pythonistas"は '[:: = 1]'を直ちに認識するでしょう。なぜなら 'reversed()'組み込みが言語に追加される前によく使われていたものだったからです。 – martineau

+0

はい、現在は行をコピーしないので読みやすく効率的です –

2

あなたは、単にリストの内包表記を使用することができます。

h = [[element for element in row if element] for row in h]

そこでここではh内のすべてのrowを反復処理。各行に対して、新しいリスト[element for element in row if element]を作成します。つまり、rowにあるelementごとに、0if element)と等しいかどうかを確認します。そうでない場合、bool(element)Trueであるため、このリストにelementを追加します。それ以外の場合はelementを省略します。

+0

' chain.from_iterable(h.tolist()) 'を使用します。 –

+0

@NickilMaveli:なぜあなたはチェーン化する必要がありますか? –

+0

これは、 'tolist()'が平らにする必要のある外側の 'list'を追加するためです。 –

関連する問題