What I mean by this is may I change the calling index of an array. For example, if I have array a = [1,2,3] can I make it so a[1] = 1? I know this is an option in FORTRAN which certainly keeps things organized and legible. Thanks
- 
                    do you mean your array index starts at 1, instead of 0? – smushi Sep 25 '14 at 03:31
- 
                    dictionaries are good for this, perhaps. – monkut Sep 25 '14 at 03:32
- 
                    If you explain your circumstance and *why* you want to do this then I am sure there is a solution. In general the solution would be to subclass the `list` type, but I doubt if that is necessary – Borodin Sep 25 '14 at 03:34
- 
                    Haha, "which certainly keeps things organized and legible". – user2864740 Sep 25 '14 at 03:35
- 
                    I just wanted to know if there was a simple solution. other than adding a dummy element – handroski Sep 25 '14 at 03:37
- 
                    @user2 864740: My thoughts exactly! This is *possible* in Perl, but it is documented with severe admonishments *not* to *ever* do it. – Borodin Sep 25 '14 at 03:41
- 
                    @handroski: As I said, there probably is a simple solution, but you haven't told us the *problem* you're trying to solve by doing this. – Borodin Sep 25 '14 at 03:42
- 
                    You can probably redefine `__getitem__` and its friends (I'm not sure if you'd really want to do that). See: http://stackoverflow.com/questions/1957780/python-overloading-the-operator-getitem-method – Yosh Sep 25 '14 at 03:47
- 
                    You can easily make it so that a[1-1] = 1. – Wlerin Sep 25 '14 at 03:54
4 Answers
Changing the indexing of a list in Python is almost definitely not what you want to do as it will break len(some_list), lead to off-by-one errors of valid input, and iteration.  Starting at index[1] runs counter to most of the language's design.
Python's lists are implemented on top of C arrays (see listobject.c in the Python source), which are indexed starting at 0.
If you're positive that you need to start counting at one, consider initializing your lists by setting a[0] to None so that you're it's clear that you're inserting a dummy value.
- 
                    1
- 
                    No problem. You could also create a function that returns a list with `None` prepended, but please note that `None` is falsey. – Sep 25 '14 at 03:46
- 
                    2Note that adding a dummy value will essentially break `len(a)` as well as iteration – Peter Gibson Sep 25 '14 at 03:46
- 
                    1Oh yeah, @PeterGibson, definitely not advisable because it means reinventing a lot of functions to handle the off-by-one error that accompanying changing the C underpinnings. – Sep 25 '14 at 03:49
- 
                    seems to register fine using len(a). Returns empty space when called. Im wondering what will happen if I attempt to plot. – handroski Sep 25 '14 at 03:50
- 
                    Adding your comment to my answer @PeterGibson, I should have included the warning alongside my disclaimer of "this is not what you want, but..." – Sep 25 '14 at 03:50
- 
                    operations on that element are a big no. This is fine for me because itll be a warning that I am off by one is my array operations. Thanks again @tristan,@Peter Gibson – handroski Sep 25 '14 at 03:56
- 
                    @tristan: I assume the OP doesn't mean to use `mylist[1]` to access `mylist[0]`, but rather that, say, `mylist[1900]` doesn't require 1,900 wasted elements to be declared, and that `mylist.append('x')` on an ampty list assigns the value to `mylist[1900]`. I think it just needs a class. – Borodin Sep 26 '14 at 17:00
- 
                    @Borodin I'm not going to assume what OP means -- if he decides that he actually wants a reserved-but-not-initialized list, I'll let him ask for it. – Sep 26 '14 at 19:17
Although in general it is inadvisable, you are free to extend built-in types, for example:
# Python 3 syntax
class FiveList(list):
    def __getitem__(self, idx):
        return super().__getitem__(idx - 5)
>>> FiveList(range(100))[10]
5
You'd have to implement a whole lot of magic methods (below), and also check if argument is int-like (index) or a slice.
__getitem__
__setitem__
__delitem__
Also, watch out for negative indices, as those are special in Python.
 
    
    - 11,241
- 4
- 68
- 120
Without knowing more about your application is is difficult to help, but it may be useful for you to read Emulating Container Types.
I suggest that if you were to write a class, say BasedArray, that had an integer base attribute that specified the index of the first element, and a normal zero-based list that held the data. Then you could get away with writing just the __len__, __get item__ and __setitem__ methods, which would be trivial, and probably __iter__ which is less so. The exact set of methods you need depends on what you want to do with these based arrays once you have them.
 
    
    - 126,100
- 9
- 70
- 144
I assume you mean start index at 1, instead of 0?
Why not just put 0 at the start? E.g.
 [0,1,2,3]
 
    
    - 701
- 6
- 17
- 
                    Thats what I do now but, I need to do operations involving many arrays. So this will eventually give me trouble – handroski Sep 25 '14 at 03:36
- 
                    
