6

Is there any simple way to invert a list slice in python? Give me everything except a slice? For example:

Given the list a = [0,1,2,3,4,5,6,7,8,9] I want to be able to extract [7,8,9,0,1,2] i.e. everything but a[3:7].

Thinking about it logically, I thought that a[-3:3] would give me what I want, but it only returns an empty list.

I am preferring a solution which will work for both python 2 and 3

Sudo Bash
  • 373
  • 5
  • 14
  • 1
    possible duplicate of [Efficient way to shift a list in python](http://stackoverflow.com/questions/2150108/efficient-way-to-shift-a-list-in-python) – Demian Brecht Oct 29 '12 at 03:17

6 Answers6

7

Slices don't wrap like that, but a[-3:] + a[:3] would give you that list.

Tom Smilack
  • 2,057
  • 15
  • 20
6

If you're willing to destroy the list (or a copy of it) you can cut out the part you don't want:

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

The order is not the same as what you asked for, though that might not be important to you.

kenm
  • 23,127
  • 2
  • 43
  • 62
4

Itertools is your friend:

itertools.islice(itertools.cycle(a),7,13)

Or generally

itertools.islice(itertools.cycle(a),gapEnd,len(a)-gapLen)

This is a generator so you can get a list with list(...) or just use it in your loop. As a generator, it does not create extra copies of the list, nor destroy the original, etc.

>>> list(itertools.islice(itertools.cycle(a),7,13))
[7, 8, 9, 0, 1, 2]
Phil H
  • 19,928
  • 7
  • 68
  • 105
2
  1) b=a[7:10]+a[:3]
     [7, 8, 9, 0, 1, 2]
  2) c=list(set(a).difference([3,4,5,6]))
     [0, 1, 2, 7, 8, 9]


  3) lis=[i for i in a if i<3 or i >6]
     [0, 1, 2, 7, 8, 9]

   4) b=[3,4,5,6]
      c=[i for i in a if i not in b]
raton
  • 418
  • 5
  • 14
1

Does the order matter?

>>> [j for i,j in enumerate(a) if not 3<=i<7]
[0, 1, 2, 7, 8, 9]
John La Rooy
  • 295,403
  • 53
  • 369
  • 502
0

OK, so this may not be exactly what you want, but is useful in some situations where you might want a slice like that.

There are two important disclaimers.

  • It doesn't preserve order
  • It removes repeated items

list(set(a).difference(a[3:7]))

James Bradbury
  • 1,708
  • 1
  • 19
  • 31