1

I keep seeing this: s[::-1] in Python and I don't know what it does. Sorry if this is a question but I'm new to python and generally programming.

Mike Driscoll
  • 32,629
  • 8
  • 45
  • 88
Nik
  • 11
  • 1
  • 1
    it's not pythonic, but it is python. – Rafael Barros Sep 24 '14 at 20:08
  • 4
    How is it non-pythonic? It's the most pythonic way to reverse a sequence that I'm aware of ... – g.d.d.c Sep 24 '14 at 20:09
  • 4
    `reversed` is much clearer. – Peter DeGlopper Sep 24 '14 at 20:10
  • 1
    This question title will not help others when searching this kind of problem. – salmanwahed Sep 24 '14 at 20:15
  • 1
    @PeterDeGlopper `reversed` and `s[::-1]` serve different purposes. You should use the former when you want to *iterate* through a sequence backwards, but use the latter when you actually want the reversed sequence. For strings, using the slice notation is almost always correct. Using `reversed` for strings is actually pretty difficult, you would have to do something like `''.join(reversed(s))`, which is definitely not pythonic. – Roger Fan Sep 24 '14 at 20:39
  • @RogerFan: Or, if you don't know what type something is, but want the same type reversed, `s[::-1]` does what you want; otherwise you need something like `(''.join if issubclass(type(s), str) else type)(reversed(s))`—which still doesn't work for `bytes`/`bytearray`/`unicode`, `pd.DataFrame`, and lots of other seuqences and sequence-like types in the stdlib and popular modules… – abarnert Sep 24 '14 at 21:25

2 Answers2

5

It reverses a sequence using slicing.

>>> s = 'hello'
>>> s[::-1]
'olleh'

The slice notation [] is a way to get a subset of some iterable container. It has the syntax

[start : stop : step]

See this post for more details.

Community
  • 1
  • 1
Cory Kramer
  • 114,268
  • 16
  • 167
  • 218
  • 2
    Any sliceable object, not just a string. – Peter DeGlopper Sep 24 '14 at 20:08
  • You are correct, updated. – Cory Kramer Sep 24 '14 at 20:09
  • 1
    The update's not quite right - not all iterables can be sliced. I think sequence is the most general term: https://docs.python.org/2/glossary.html#term-sequence – Peter DeGlopper Sep 24 '14 at 20:12
  • Updated again! One of these days I'll use the right term. – Cory Kramer Sep 24 '14 at 20:14
  • It is admittedly an obscure subject unless you're working with the collections abstract base classes: https://docs.python.org/2/library/collections.html#collections-abstract-base-classes – Peter DeGlopper Sep 24 '14 at 20:15
  • It gets even more confusing language hopping too, because 75% of my day-to-day programming at work is C++, so I have to be careful about Python "list" vs C++ "std::list", etc. Some colloquial terms have technical meanings in other languages and vice versa. – Cory Kramer Sep 24 '14 at 20:16
  • And technically speaking you can overload the slice notation if you want. But... you probably shouldn't do that. – Wayne Werner Sep 24 '14 at 20:17
  • "… some iterable container …" is still wrong. Something can easily be iterable, and a container, but not a sequence. Like, say, `dict`. – abarnert Sep 24 '14 at 21:22
  • 1
    @WayneWerner: Well, you definitely _should_ do it if you're trying to build a custom sequence, or a not-quite-sequence like a numpy array or pandas frame… – abarnert Sep 24 '14 at 21:23
0

Slicing is an operation that gives you some elements out of a sequence.

s[a:b:c] means "the items starting at a, stopping at b, with a step of c".

If you have s[::-1] that means "the whole sequence, going backwards".

khelwood
  • 55,782
  • 14
  • 81
  • 108