SMJune
SMJune

Reputation: 407

slicing a list across several slices

I'm looking to slice a list across two or more slices. For example, there is a list:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Let's say I want to slice the list as items 1 to 4 and 6 to 9.

If we do:

a[1:5]

the output:

[1, 2, 3, 4]

If we do:

a[6:10]

the output is:

[6, 7, 8, 9]

But is there someway to combine multiple slices. Something like:

a[1:5 and 6:10]

to output:

[1, 2, 3, 4, 6, 7, 8, 9]

Upvotes: 1

Views: 795

Answers (6)

napuzba
napuzba

Reputation: 6288

You can use list.extend for this task.

slice1 = a[1:5]
slice2 = a[6:10]
slice1.extend(slice2)
# now use slice1

It appends all the items of the slice2 to the first slice1.

Upvotes: 1

Inspired by the answer:

There is no special syntax, just append the lists slices:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

print(a[1:5]+a[6:10])

                                           FROM -> Aviv Yaniv

b, a = a[1:5], a[6:10]

print(b+a)

Upvotes: 0

Mark
Mark

Reputation: 92440

If you have several ranges you are trying to slice, you can use the built-in slice() with a list comprehension:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

ranges = [(1, 5), (6, 10)]   

[n for s in ranges for n in a[slice(*s)]]
# [1, 2, 3, 4, 6, 7, 8, 9]

Upvotes: 0

SMJune
SMJune

Reputation: 407

Based on napuzba's suggestion, I'm thinking that the following might be the most efficient way to do this:

all_slice = [*a[1:5], *a[6:10]]

Where all_slice holds:

[1, 2, 3, 4, 6, 7, 8, 9]

This seems pretty pythonic.

Upvotes: 1

tobias_k
tobias_k

Reputation: 82899

If you want to avoid creating the intermediate lists for the individual slices, you could use itertools.islice and chain.from_iterable to get and combine the slices as iterators.

>>> from itertools import chain, islice
>>> slc = [(1,5), (6,10)]
>>> list(chain.from_iterable(islice(a, *s) for s in slc))
[1, 2, 3, 4, 6, 7, 8, 9]

Also works with 1- or 3-tuples, for just end-, or start-end-step slices.

Upvotes: 1

Aviv Yaniv
Aviv Yaniv

Reputation: 6298

There is no special syntax, just append the lists slices:

a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# [1, 2, 3, 4, 6, 7, 8, 9]
print(a[1:5]+a[6:10])

Upvotes: 1

Related Questions