おそらく深刻なソースからsageスクリプトをダウンロードしました。私のコンピューターでは動作しません。簡単なデバッグにより、ある時点で、作成者がn要素リストに1からnまでの番号が付けられているかのように実行していたという事実から問題が発生したことがわかりました(「通常の」番号付け) in Pythonおよび(したがって)sageは0..n-1)。
何が足りないのですか? APLのように、この規則を変更するグローバル変数がどこかに隠されていますか?
あなたの助けに感謝します(英語とCSishの両方の私の弱い理解にもかかわらず私の質問が明確であることを願っています...)
Python(したがってsage)リストには常に0から番号が付けられており、それを変更する方法はありません。
CPythonのソースを見ると、 http://hg.python.org/cpython/file/70274d53c1dd/Objects/listobject.c の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];
}
アイテムルックアップは、基になるC配列に直接委任し、 C配列は常にゼロベースです 。したがって、Pythonリストも常にゼロベースです。
インデックスをシフトする単純なクラスは、再利用可能なものへのクリーンなインターフェイスを提供します。
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]
さて、私も1から開始するインデックス作成の方法を実装する方法について同じ考えに直面していました。次のような挿入ソートアルゴリズムを実装したかったのです。
pythonリストは0から始まることはすでに知っているので、私がしたことは次のとおりです。
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に「ダミー」を追加し、アルゴリズムと同様にすべての作業を行い、「ダミー」を再度削除しました。これは単なる不正行為でした。