41176
pythonにて  
`S=0,1,2,....,a(b+1)`までの組み合わせで、この`S`から2つ取り出して列挙していく(`a=4`,
`b=2`)やり方でこのようにプログラミングが書けると教えていただいたんですが↓↓↓

```

    import itertools
    a = 4
    b = 2
    c = a*(b+1)+1
    l = list(itertools.combinations(range(0, c, 1), 2))
    print(l)
    
```

この際に、`S`の`(0,p,p+a*q)`を除いて列挙したいです。  
やり方を教えていただきたいです。

(今回は、`p=1`, `q=1`で数値を入れたいです→つまり`(0,1,5)`を取り除きたいです)

よろしくお願いします。
CC BY-SA 3.0
2018-01-24T06:56:58.487
41175
2018-01-24T08:21:41.580
2018-01-24T08:21:41.580
19110
27045
question
python
リストから組み合わせで取り出す際に、要素範囲を指定して列挙したい
`S` から要素を除いた上で `combinations` を計算したいので、これをそのままコードとして書けばよいです。

たとえば
[`list.remove`](https://docs.python.jp/3/tutorial/datastructures.html#more-on-
lists) を使って下のように書けます。

```

    $ python3
    >>> import itertools
    >>> a = 4
    >>> b = 2
    >>> p = 1
    >>> q = 1
    >>> s = list(range(1, a * (b + 1) + 1))
    >>> s.remove(p)
    >>> s.remove(p + a * q)
    >>> s
    [2, 3, 4, 6, 7, 8, 9, 10, 11, 12]
    >>> list(itertools.combinations(s, 2))
    [(2, 3), (2, 4), (2, 6), (2, 7), (2, 8), (2, 9), (2, 10), (2, 11), (2, 12), (3, 4), (3, 6), (3, 7), (3, 8), (3, 9), (3, 10), (3, 11), (3, 12), (4, 6), (4, 7), (4, 8), (4, 9), (4, 10), (4, 11), (4, 12), (6, 7), (6, 8), (6, 9), (6, 10), (6, 11), (6, 12), (7, 8), (7, 9), (7, 10), (7, 11), (7, 12), (8, 9), (8, 10), (8, 11), (8, 12), (9, 10), (9, 11), (9, 12), (10, 11), (10, 12), (11, 12)]
    
```

除きたい要素が増えたときのために、`for` を使って `S` を作るのも良いでしょう。

```

    >>> s = list(range(0, a * (b + 1) + 1))
    >>> elem = [0, p, p + a * q]
    >>> for i in elem:
    ...     s.remove(i)
    ... 
    >>> s
    [2, 3, 4, 6, 7, 8, 9, 10, 11, 12]
    
```

あるいは[リスト内包表記](https://docs.python.jp/3/tutorial/datastructures.html#list-
comprehensions)を使って次のようにも書けます。

```

    s = [i for i in range(0, a * (b + 1) + 1) if i not in [0, p, p + a * q]]
    
```
CC BY-SA 3.0
2018-01-24T08:04:43.403
41176
2018-01-24T08:19:08.663
2018-01-24T08:19:08.663
19110
19110
41175
answer
例えば`filter`関数を使って

```

    S = range(0,c,1)
    p = 1
    q = 1
    T = filter(lambda v: v not in (0,p,p+a*q), S)
    l = list(itertools.combinations(T, 2))
    print(l)
    
```

とできます。
CC BY-SA 3.0
2018-01-24T08:07:16.797
41177
2018-01-24T08:07:16.797
13199
41175
answer