52070


python初心者・独学者です。ある程度のことはできるようになったのですが、以下の方法が全くつかめずに頭を抱えています。  
どなたかよろしくお願いいたします。

[code]

    list_a = [
        { "a" : "住所A" , "b" : "成人" , "c" : "女" , "d" : "いる" } ,
        { "a" : "住所B" , "b" : "成人" , "c" : "男" , "d" : "いる" } , 
        { "a" : "住所C" , "b" : "小児" , "c" : "男" , "d" : "いる"} ,
        { "a" : "住所D" , "b" : "成人" , "c" : "男" , "d" : "いない"} ]
    
[/code]

のような二次元配列のリストがある場合、`"b" == "小児"` の場合は、そのリストを削除して以下の新たなリストを作りたいと思っています。

[code]

    list_b = [
        { "a" : "住所A" , "b" : "成人" , "c" : "女" , "d" : "いる" } ,
        { "a" : "住所B" , "b" : "成人" , "c" : "男" , "d" : "いる" } , 
        { "a" : "住所D" , "b" : "成人" , "c" : "男" , "d" : "いない"} ]
    
[/code]

つまり、二次元配列リスト（list_a）内の、特定のリスト`({ "a" : "住所C" , "b" : "小児" , "c" : "男" , "d" :
"いる"})`内の、特定の要素`("b" : "小児")`に当てはまる場合は、リスト全体から、このリストのみを外したいのです。

`for in range ()`文を使ってやってみたのですが、なぜか`out of
range`のエラーが出てしまい、途中でストップしていまいます。おそらく、リストが削除されると、その分だけ`range()`の数が減ってしまっていくことが原因と思われますが、それを回避する方法が分かりません。

特に`for`文にこだわっているわけではないので、他にも方法があるのであれば、教えていただけると嬉しいです。

非常にわかりにくい質問となってしまいましたが、御教授いただけると幸いです。

実際に試したコードは以下です。

[code]

    list_a = [
            { "a" : "住所A" , "b" : "成人" , "c" : "女" , "d" : "いる" } ,
            { "a" : "住所B" , "b" : "成人" , "c" : "男" , "d" : "いる" } ,
            { "a" : "住所C" , "b" : "小児" , "c" : "男" , "d" : "いる"} ,
            { "a" : "住所D" , "b" : "成人" , "c" : "男" , "d" : "いない"}
            ]
    
    for i in range ( 0 , len(list_a) ) :
        if list_a[i]["b"] == "小児" :
            list_b == list_a.remove (list_a[i]) 
    
    print (list_b)
    
[/code]

if文の後にelse文が載っていませんが、これを付けるとエラーが出てしまうか、breakすると、Noneが帰ってきます。そもそも、for文でこの問題を解決できるのかどうかかが、分かりません…。


CC BY-SA 4.0
2019-01-18T05:07:21.290
52068
2019-01-18T06:17:52.290
2019-01-18T05:53:45.130
31829
31829
question
python
二次元配列のリストから、特定の要素を含むリストを削除する方法について


リスト内包表記の[後置if](https://qiita.com/y__sama/items/a2c458de97c4aa5a98e7#if%E3%82%92%E5%90%AB%E3%82%80%E5%A0%B4%E5%90%88%E5%BE%8C%E7%BD%AEif)で取得できます。

[code]

    `list_b = [x for x in list_a if x["b"] != "小児"]`
    
[/code]

**追記:**

ご質問のコードでは`i`に0..3が代入されますが、`list_a.remove`すると配列末尾のインデックスが減っていきます。  
今回はfor文の最後に`list_a[3]`がなくなっていることが`out of range`エラーが発生する原因です。

`list_b == list_a.remove
(list_a[i])`は代入演算子(`=`)ではなく(`==`)比較演算子である点、`list_a.remove`は戻り値を返さない点を考慮して、もう一度コードを読み直すと理解が深まるのではないかと存じます。

[code]

    list_a = [ { "a" : "住所A" , "b" : "成人" , "c" : "女" , "d" : "いる" } , { "a" : "住所B" , "b" : "成人" , "c" : "男" , "d" : "いる" } , { "a" : "住所C" , "b" : "小児" , "c" : "男" , "d" : "いる"} , { "a" : "住所D" , "b" : "成人" , "c" : "男" , "d" : "いない"} ]
    list_b = []
    for x in list_a:
        if x["b"] == "小児":
            continue
        list_b.append(x)
    
    list_b
    
[/code]


CC BY-SA 4.0
2019-01-18T05:47:17.187
52070
2019-01-18T06:17:52.290
2019-01-18T06:17:52.290
9820
9820
52068
answer