リストから組み合わせで取り出す際に、要素範囲を指定して列挙したい


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

[code]

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

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

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

よろしくお願いします。




`S` から要素を除いた上で `combinations` を計算したいので、これをそのままコードとして書けばよいです。

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

[code]

    $ 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)]
    
[/code]

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

[code]

    >>> 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]
    
[/code]

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

[code]

    s = [i for i in range(0, a * (b + 1) + 1) if i not in [0, p, p + a * q]]
    
[/code]




`S` から要素を除いた上で `combinations` を計算したいので、これをそのままコードとして書けばよいです。

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

[code]

    $ 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)]
    
[/code]

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

[code]

    >>> 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]
    
[/code]

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

[code]

    s = [i for i in range(0, a * (b + 1) + 1) if i not in [0, p, p + a * q]]
    
[/code]

