

2つ以上の特定の要素を含むリストのインデックスを抽出したいです。

具体的には

[code]

    li=[[1,2,3],[2,3,4],[3,4,5],[4,5,6],[2,3,4],[1,2,3],[2,3,4],[5,6,7]]
    
[/code]

から2と3を含むリストのインデックス抽出し

[code]

    list = [0,1,4,5,6]
    
[/code]

となるlistの作成をしたいと考えています。  
よろしくお願いします。


CC BY-SA 4.0
2020-12-02T05:59:44.983
72338
2020-12-04T02:43:45.973
2020-12-02T10:47:53.117
32986
42963
question
python
Pythonで2次元リストの条件に合うインデックスを抽出


リスト内包表記と[enumerate](https://docs.python.org/ja/3/library/functions.html#enumerate)、[set型](https://docs.python.org/ja/3/library/stdtypes.html#set-
types-set-frozenset)を組み合わせれば一行で抽出できます。

[code]

    li=[[1,2,3],[2,3,4],[3,4,5],[4,5,6],[2,3,4],[1,2,3],[2,3,4],[5,6,7]]
    list = [i for i, l in enumerate(li) if set([2, 3]).issubset(l)]
    list
    # [0, 1, 4, 5, 6]
    
[/code]


CC BY-SA 4.0
2020-12-02T06:54:40.747
72339
2020-12-02T06:54:40.747
9820
72338
answer


以下のコードで出来ます。

[code]

        li=[[1,2,3],[2,3,4],[3,4,5],[4,5,6],[2,3,4],[1,2,3],[2,3,4],[5,6,7]]
    
        newList=[]
        
        for index,innerList in enumerate(li):
            if 2 in innerList and 3 in innerList:
                newList.append(index)
                
        print(newList)
        #出力結果 [0, 1, 4, 5, 6]
    
[/code]

まず、新しいindexを含む空のリスト`newList=[]`を作成します。  
enumerate(li)で、リスト内のリスト(innerList )とindex番号を抽出してfor文を回します。

リスト内に2が含まれているかどうかを `if 2 in innerList `で調べて、リスト内に3が含まれているかどうかを`3 in innerList
`で調べます。

もし、両方含まれていたら、index番号をnewListに追加します。


CC BY-SA 4.0
2020-12-02T06:56:34.887
72341
2020-12-02T06:56:34.887
36446
72338
answer


numpy を使って変数 `li` を `numpy.ndarray` 型にすると少し簡単になります。

[code]

    >>> import numpy as np
    >>> li = np.array([
      [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6],
      [2, 3, 4], [1, 2, 3], [2, 3, 4], [5, 6, 7]
    ])
    >>> np.intersect1d(*[np.where(li==k)[0] for k in (2, 3)])
    array([0, 1, 4, 5, 6])
    
[/code]


CC BY-SA 4.0
2020-12-02T08:25:36.307
72343
2020-12-02T08:41:38.393
2020-12-02T08:41:38.393
72338
answer


NumPyのブール演算を使った方法です。探す値が何個であっても可能です。

[code]

    import numpy as np
    
    def search_index(li, values):
        arr = np.asarray(li)
        arr_v = np.asarray(values).reshape(-1, 1, 1)
        return (arr == arr_v).any(2).all(0).nonzero()[0]
    
[/code]

動作例：

[code]

    In [11]: li = [[1,2,3],[2,3,4],[3,4,5],[4,5,6],[2,3,4],[1,2,3],[2,3,4],[5,6,7]]
    
    In [12]: search_index(li, [2, 3])
    Out[12]: array([0, 1, 4, 5, 6], dtype=int64)
    
    In [13]: search_index(li, [2, 3, 4])
    Out[13]: array([1, 4, 6], dtype=int64)
    
    In [14]: search_index(li, [1])
    Out[14]: array([0, 5], dtype=int64)
    
[/code]


CC BY-SA 4.0
2020-12-04T02:38:06.150
72387
2020-12-04T02:43:45.973
2020-12-04T02:43:45.973
37167
37167
72338
answer