

2次元配列liから重複する配列数を指定することでその配列を取り出せず困っています。

[code]

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

例えば、配列[1,2,3]は3つ重複しており、o=3 を指定することで[1,2,3]が取り出せるようにしたいです。  
また、o=2とすると[5,6,7],[2,3,4,5]が取り出せることを想定しております。

よろしくお願いします。


CC BY-SA 3.0
2015-12-16T03:24:00.770
20048
2015-12-16T04:07:12.940
13676
question
python
pythonを用いて2次元配列から重複する配列を取り出す


回答

[code]

    >>> from collections import Counter
    >>> li=[[1,2,3],[5,6,7],[2,3,4,5],[1,2,3],[7,8,9],[2,3,4,5],[1,2,3],[5,6,7]]
    >>> o = 2
    >>> c = Counter(tuple(x) for x in li)
    >>> [list(k) for k,v in c.items() if v==o]
    [[2, 3, 4, 5], [5, 6, 7]]
    
[/code]


CC BY-SA 3.0
2015-12-16T04:06:31.130
20051
2015-12-16T04:06:31.130
806
20048
answer


カウントするのにリストでは都合が悪いため、一旦タプルにしてみました。  
重複なしのデータはset()を使っています。

`li=[[1,2,3],[5,6,7],[2,3,4,5],[1,2,3],[7,8,9],[2,3,4,5],[1,2,3],[5,6,7]]  
tp = map(tuple, li)  
tp`

> [(1, 2, 3),  
>  (5, 6, 7),  
>  (2, 3, 4, 5),  
>  (1, 2, 3),  
>  (7, 8, 9),  
>  (2, 3, 4, 5),  
>  (1, 2, 3),  
>  (5, 6, 7)]

`pattern = tuple(set(tp))  
pattern`

> ((2, 3, 4, 5), (5, 6, 7), (7, 8, 9), (1, 2, 3))

`qty = map(lambda x: tp.count(x), pattern)  
qty`

> [2, 2, 1, 3]

`data = zip(qty, pattern)  
data`

> [(2, (2, 3, 4, 5)), (2, (5, 6, 7)), (1, (7, 8, 9)), (3, (1, 2, 3))]

`o = lambda num: map(lambda y: list(y[1]), filter(lambda x: x[0] == num,
data))  
o(3)`

> [[1, 2, 3]]

`o(2)`

> [[2, 3, 4, 5], [5, 6, 7]]


CC BY-SA 3.0
2015-12-16T04:07:12.940
20052
2015-12-16T04:07:12.940
7754
20048
answer