52074


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" == "小児"`の場合には、その行のリストすべてを削除して以下の`list_b`

[code]

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

を作成する場合、リスト内包表記を用いて、

[code]

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

とすれば良いことは分かりました。

ここで、上記内包表記の記述方法に疑問がわきました。  
list_aの中の特定の要素を記述する場合、例えば、

[code]

    list_a[0]["b"]
    
[/code]

のようにすると

[code]

    "成人"
    
[/code]

が帰ってきます。しかし、上記のリスト内包表記では、この`["b"]`の要素を指定するのに`list_a["b"]`のみで指定できています。`["b"]`の前の`[]`がないことに違和感があります。  
例えば、

[code]

    print(list_a[0]["b"])
    
[/code]

は問題ありませんが、

[code]

    print(list_a["b"])
    
[/code]

ではTypeError: list indices must be integers or slices, not strが帰ってきます。

この違いはどのように考えれば良いのでしょうか？


CC BY-SA 4.0
2019-01-18T07:52:14.450
52073
2019-01-18T08:09:36.837
2019-01-18T07:55:39.830
19110
31829
question
python
二次元配列リストの個々の要素についての疑問


リストそのものと、リストの要素とを区別してください。リスト内包表記で使う変数はリストそのものではなく、リストの要素です。

質問文にあるのは dict のリストですが、もっと簡単なリストで考えると分かりやすいかなと思います。次のサンプルは、整数のリストの要素を全て +1
するものです。ここで `x` は `lst1` の各要素 `2`, `3`, `5`, `7`, `11` を順番に表します。

[code]

    >>> lst1 = [2, 3, 5, 7, 11]
    >>> lst2 = [x + 1 for x in lst1]
    >>> print(lst2)
    [3, 4, 6, 8, 12]
    
[/code]


CC BY-SA 4.0
2019-01-18T07:59:41.553
52074
2019-01-18T08:09:36.837
2019-01-18T08:09:36.837
19110
19110
52073
answer