2011-08-30 11 views
7

Pobrałem z rzekomo poważnego źródła skrypt szałwi. To nie działa na moim komputerze, a szybkie debugowanie pokazało, że problem wynikał z faktu, że w pewnym momencie autorzy robili tak, jakby lista n-elementowa była ponumerowana od 1 do n (podczas gdy "normalna" numeracja w Pythonie i (w ten sposób) sage jest 0..n-1).Python/sage: can lists start at index 1?

Czego mi brakuje? Czy istnieje gdzieś zmienna globalna, która zmienia tę konwencję, tak jak w APL?

Dzięki za pomoc (mam nadzieję, że moje pytanie jest jasne, pomimo mojego słabego uścisku angielskim i CSish ...)

+2

Czy mógłbyś przynajmniej opublikować odpowiednią część kodu? – steabert

+3

Notacja (1..n) wydaje się być specyficznym pismem Sage (http://stackoverflow.com/questions/3511699/python-1-n-syntax) –

+1

@ Listy CédricJulien są indeksowane, począwszy od 0 w Sage, a także ponieważ jest oparty na Pythonie. Podany link jest sposobem na sporządzenie listy ... takich jak [6..12] jest lista [6, 7, 8, 9, 10, 11, 12]. Ale indeksy pozycji na tej liście będą wynosić 0, 1, 2, 3, 4, 5, 6. Ponownie, jest to sposób tworzenia listy, a nie sposób ponownego indeksowania listy. – Graphth

Odpowiedz

6

Python (i dlatego mędrzec) wykazy zawsze są numerowane od 0, i nie ma sposób na zmianę tego.

Patrząc na źródło CPython jest w http://hg.python.org/cpython/file/70274d53c1dd/Objects/listobject.c na linii 449:

static PyObject * 
list_item(PyListObject *a, Py_ssize_t i) 
{ 
    if (i < 0 || i >= Py_SIZE(a)) { 
     if (indexerr == NULL) { 
      indexerr = PyString_FromString(
       "list index out of range"); 
      if (indexerr == NULL) 
       return NULL; 
     } 
     PyErr_SetObject(PyExc_IndexError, indexerr); 
     return NULL; 
    } 
    Py_INCREF(a->ob_item[i]); 
    return a->ob_item[i]; 
} 

W pozycji lookup delegaci prosto do podstawowych C tablicy i C arrays are always zero-based. Zatem listy Pythona są zawsze oparte na zera.

0

No ja też był z widokiem na samą myśl o tym, jak wdrożyć metodę indeksowania należy rozpocząć od 1. chciałem wdrożyć Sortowanie przez wstawianie algorytm, który przedstawia się następująco: Insertion Sort Algorithm

Jak już wiemy lista pyton zaczynają się od 0, co zrobiłem, było następujące:

A = ['dummy',5,2,6,4,1,3] 
for j in range(2,len(A)): 
    key = A[j] 
    i=j-1 
    while i>0 and A[i]>key: 
     A[i+1] = A[i] 
     i = i-1 
    A[i+1] = key 
A.pop(0) 
print A 

Właśnie dodałem „dummy” w indeksie 0, całą pracę jak w algorytmie i usunął „manekina” ponownie. To była tylko metoda oszustwa.

1

Prosta klasa, która przesuwa indeks, zapewnia czysty interfejs do czegoś, co można ponownie wykorzystać.

class Array(object): 

    def __init__(self, items: list) -> None: 
     self.items = items 

    def __repr__(self) -> str: 
     return '{}({})'.format(self.__class__.__name__, self.items) 

    def __len__(self) -> int: 
     return len(self.items) 

    def __contains__(self, item: any) -> bool: 
     return item in self.items 

    def __getitem__(self, key: int) -> any: 
     return self.items[key - 1] 

    def __setitem__(self, key: int, value: any) -> None: 
     self.items[key - 1] = value 

    def __delitem__(self, key: int) -> None: 
     del self.items[key - 1]