3
mylist = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"
print(mylist)

エラー:

IndexError: list assignment index out of range

javascript でインデックスによる値の割り当てを覚えていますが、Python では機能しませんか?

4

4 に答える 4

14

Python のリストは 0-index です。リストには 6 つの要素があるため、 から までの任意の要素にインデックスを付けることができ0ます5。これらの境界を超えようとすると、通常のlist型では機能しませんが、暗黙のリスト拡張としてインデックスを使用したいようです。

そのためには、スパース コンテナが必要です。サブクラス リストの簡単な実装を次に示します。

class SparseList(list):
    def __setitem__(self, index, value):
        """Overrides list's __setitem__ to extend the list
           if the accessed index is out of bounds."""
        sparsity = index - len(self) + 1
        self.extend([None] * sparsity)
        list.__setitem__(self, index, value)

これを次のように使用します。

In [8]: sl = SparseList()

In [9]: print(sl)
[]

In [10]: sl[3] = "hi"

In [11]: print(sl)
[None, None, None, 'hi']

そしてあなたの具体例:

In [11]: mylist = SparseList(["a", "apple", "b", "ball", "c", "cat"])

In [12]: print mylist
['a', 'apple', 'b', 'ball', 'c', 'cat']

In [13]: mylist[6] = "value"

In [14]: print mylist
['a', 'apple', 'b', 'ball', 'c', 'cat', 'value']

そして、もう少し自作したくない場合は、試してみてくださいblist

于 2012-05-17T05:46:05.560 に答える
5

Python では、インデックスが存在しない場合、単一の割り当ては機能しません。Javascript 配列は「スパース」であり、任意のインデックスに値を格納できます。代わりに、python リストには定義されたサイズがあり、割り当ては既存のインデックスでのみ許可されます。

最後に追加したい場合はmylist.append(value)

于 2012-05-17T05:48:19.960 に答える
1

birrye で説明されているように、あなたが求めていることは SparseList で実行できます。または、いつでも追加を使用できます。Python辞書では、インデックス付きの割り当てを行うことができますが、

dic = {}
dic['1'] = 100
dic['2'] = 200

だからあなたができることは、このように書くことです、

list = {}
i = 1 #Your index
list[str(i)] = value #Your value

これにより、実行時間が少し長くなる可能性があります。割り当てられていないインデックスを参照すると、IndexError 例外が発生します。

于 2012-05-17T06:38:08.453 に答える
0

最初にオブジェクトのリストを作成することでこれを実現できますがNone、おそらく最善の方法ではありません。

mylist = [None] * 10
mylist[0:5] = ["a", "apple", "b", "ball", "c", "cat"]
mylist[6] = "value"

または、リストの最後に要素を追加することもできます。

mylist = ["a", "apple", "b", "ball", "c", "cat"]

# create 7th element
mylist += ["value"]

# create 10th element
mylist += [None] * 2 + ["value2"]
于 2012-05-17T05:50:42.817 に答える