2011-08-30 4 views
7

私はおそらく深刻なソースからセージスクリプトをダウンロードしました。私のコンピュータ上では動作しませんし、素早いデバッグでは問題は、n要素のリストに1からnの番号が付けられているかのように、 Pythonでは(したがって)sageは0..n-1です)。Python/sage:リストはインデックス1から始めることができますか?

私には何が欠けていますか? APLのように、この慣習を変更するグローバル変数がどこかに隠されていますか?

ご協力いただきありがとうございます(私は...私の質問は、英語とCSish両方の私の微弱な把握にもかかわらず、明らかであると思います)

+2

少なくともコードの関連部分を投稿することはできますか? – steabert

+3

(1..n)表記法はSage特有の書き方であるようです(http://stackoverflow.com/questions/3511699/python-1-n-syntax) –

+1

@CédricJulienリストはSageで0から始まるインデックスが付けられていますこれはPythonに基づいているためです。あなたが与えるリンクはリストを作る方法です... [6..12]のようなリストは[6,7,8,9,10,11,12]です。しかし、このリストの項目のインデックスは、0,1,2,3,4,5,6となります。リストを再作成する方法ではなく、リストを作成する方法です。 – Graphth

答えて

6

パイソン(したがって、セージ)のリストは、常に0から番号が付けられ、そこではありませんされていますそれを変える方法。ライン449上のhttp://hg.python.org/cpython/file/70274d53c1dd/Objects/listobject.cではCPythonのソースを見てみると

、:

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]; 
} 

アイテム・ルックアップ・ストレート基礎となるC配列に委譲し、C arrays are always zero-based。したがって、Pythonリストは常にゼロベースでもあります。

0

まあ私も、私は次のようにしている挿入ソートアルゴリズムを実装したかった1 から開始されるインデックス付けのメソッドを実装する方法について同じ考えに直面していた。 Insertion Sort Algorithm

我々はすでに知っているように0からPythonのリストの先頭には、私は次のようたんでした何:

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 

私はちょうどアルゴリズムのようにすべての作業を行なったし、もう一度「ダミー」を取り出し、インデックス0に「ダミー」を追加しました。これは単に不正な方法でした。

1

インデックスをシフトするシンプルなクラスは、再利用可能なものにクリーンなインターフェイスを提供します。

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] 
関連する問題