Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: single colon vs double colon

What is the difference between single and double colon in this situation? data[0:,4] vs data[0::,4]

women_only_stats = data[0::,4] == "female" 

men_only_stats = data[0::,4] != "female"   

I tried to replace data[0::,4] with data[0:,4] and I see no difference. Is there any difference in this or another case?

data is 2-dimensional array with rows like ['1' '0' '3' 'Braund, Mr. Owen Harris' 'male' '22' '1' '0' 'A/5 21171' '7.25' '' 'S']

like image 689
Nik Avatar asked Jul 02 '16 13:07

Nik


2 Answers

No, there is no difference.

See the Python documentation for slice:

From the docs: a[start:stop:step]

The start and step arguments default to None. Slice objects have read-only data attributes start, stop and step which merely return the argument values (or their default).

In this case, you are including an empty step parameter.

>>> a = [1,2,3,4]
>>> a[2:]
[3,4]
>>> a[2::]
[3,4]
>>> a[2:] == a[2::]
True

And to understand what the step parameter actually does:

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

So by leaving it to be implicitly None (i.e., by either a[2:] or a[2::]), you are not going to change the output of your code in any way.

Hope this helps.

like image 72
Friendly King Avatar answered Oct 12 '22 11:10

Friendly King


Both syntaxes result in the same indexes.

class Foo(object):
  def __getitem__(self, idx):
    print(idx)

Foo()[1::,6]
# prints (slice(1, None, None), 6)
Foo()[1:,6]
# prints (slice(1, None, None), 6)

Basically, 1::,6 is a tuple of a slice (1::) and a number (6). The slice is of the form start:stop[:stride]. Leaving the stride blank (1::) or not stating it (1:) is equivalent.

like image 26
MisterMiyagi Avatar answered Oct 12 '22 12:10

MisterMiyagi