Elegant-ness VS Obvious-ness
To be honest, I thought the way of slicing in Python is quite counter-intuitive, it's actually trading the so called elegant-ness with more brain-processing, that is why you can see that this StackOverflow article has more than 2Ks of upvotes, I think it's because there's a lot of people don't understand it intially.
Just for example, the following code had already caused headache for a lot of Python newbies.
x = [1,2,3,4]
print(x[0:1])
# Output is [1]
Not only it is hard to process, it is also hard to explain properly, for example, the explanation for the code above would be take the zeroth element until the element before the first element.
Now look at Ruby which uses upper-bound inclusive.
x = [1,2,3,4]
puts x[0..1]
# Output is [1,2]
To be frank, I really thought the Ruby way of slicing is better for the brain.
Of course, when you are splitting a list into 2 parts based on an index, the exclusive upper bound approach would result in better-looking code.
# Python
x = [1,2,3,4]
pivot = 2
print(x[:pivot]) # [1,2]
print(x[pivot:]) # [3,4]
Now let's look at the the inclusive upper bound approach
# Ruby
x = [1,2,3,4]
pivot = 2
puts x[0..(pivot-1)] # [1,2]
puts x[pivot..-1] # [3,4]
Obviously, the code is less elegant, but there's not much brain-processing to be done here.
Conclusion
In the end, it's really a matter about Elegant-ness VS Obvious-ness, and the designers of Python prefer elegant-ness over obvious-ness. Why? Because the Zen of Python states that Beautiful is better than ugly.