Here is an alternative, that does not use enumerate() to create tuples (as in SilentGhost’s original answer).

This seems more readable to me. (Maybe I’d feel differently if I was in the habit of using enumerate.) CAVEAT: I have not tested performance of the two approaches.

```
# Returns a new list. "lst" is not modified.
def delete_by_indices(lst, indices):
indices_as_set = set(indices)
return [ lst[i] for i in xrange(len(lst)) if i not in indices_as_set ]
```

NOTE: Python 2.7 syntax. For Python 3, `xrange`

=> `range`

.

Usage:

```
lst = [ 11*x for x in xrange(10) ]
somelist = delete_by_indices( lst, [0, 4, 5])
```

somelist:

```
[11, 22, 33, 66, 77, 88, 99]
```

**— BONUS —**

Delete multiple values from a list. That is, we have the values we want to delete:

```
# Returns a new list. "lst" is not modified.
def delete__by_values(lst, values):
values_as_set = set(values)
return [ x for x in lst if x not in values_as_set ]
```

Usage:

```
somelist = delete__by_values( lst, [0, 44, 55] )
```

somelist:

```
[11, 22, 33, 66, 77, 88, 99]
```

This is the same answer as before, but this time we supplied the VALUES to be deleted `[0, 44, 55]`

.