I just checked and it should be quite straightforward to support list of penalties in all solvers. The only difficulty is for the sparse_cg solver with LinearOperator. You'll need to use a closure.

```python
def create_mv(alpha):
    def _mv(x):
       return X1.matvec(X1.rmatvec(x)) + alpha * x
    return _mv
```
Then, in the for loop, you can call it like this:
```python
mv = create_mv(alpha[i])
```