Invert slice in python

2019-06-19 02:28发布

问题:

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

回答1:

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.



回答2:

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



回答3:

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]


回答4:

  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]


回答5:

Does the order matter?

>>> [j for i,j in enumerate(a) if not 3<=i<7]
[0, 1, 2, 7, 8, 9]


回答6:

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]))