751

10 個の要素を保持できる空のリスト (または最善の方法) を作成したいと考えています。

その後、そのリストに値を割り当てたいとします。たとえば、これは 0 から 9 を表示することになっています。

s1 = list();
for i in range(0,9):
   s1[i] = i

print s1

しかし、このコードを実行すると、エラーが発生するか、別のケースでは単に表示されます[](空)。

誰かが理由を説明できますか?

4

17 に答える 17

1151

lst[i] = somethingリストが少なくともi+1要素で初期化されていない限り、 のようなリストに割り当てることはできません。リストの最後に要素を追加するには、append を使用する必要があります。lst.append(something).

(辞書を使用している場合は、代入表記を使用できます)。

空のリストの作成:

>>> l = [None] * 10
>>> l
[None, None, None, None, None, None, None, None, None, None]

上記のリストの既存の要素に値を割り当てる:

>>> l[1] = 5
>>> l
[None, 5, None, None, None, None, None, None, None, None]

l[15] = 5リストには 10 個の要素しかないため、次のようなものは失敗することに注意してください。

range(x) は [0, 1, 2, ... x-1] からリストを作成します

# 2.X only. Use list(range(10)) in 3.X.
>>> l = range(10)
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

関数を使用してリストを作成する:

>>> def display():
...     s1 = []
...     for i in range(9): # This is just to tell you how to create a list.
...         s1.append(i)
...     return s1
... 
>>> print display()
[0, 1, 2, 3, 4, 5, 6, 7, 8]

リスト内包表記 (範囲についてはこれをすべて行う必要がないため、四角形を使用します。単に返すことができますrange(0,9)):

>>> def display():
...     return [x**2 for x in range(9)]
... 
>>> print display()
[0, 1, 4, 9, 16, 25, 36, 49, 64]
于 2012-05-23T00:44:12.223 に答える
183

代わりにこれを試してください:

lst = [None] * 10

上記は、サイズ 10 のリストを作成し、各位置は に初期化されNoneます。その後、要素を追加できます。

lst = [None] * 10
for i in range(10):
    lst[i] = i

確かに、これは Python のやり方ではありません。これを行う方が良い:

lst = []
for i in range(10):
    lst.append(i)

またはさらに簡単に、Python 2.x ではこれを実行して、0 から 9 までの値でリストを初期化できます。

lst = range(10)

そして Python 3.x では:

lst = list(range(10))
于 2012-05-23T00:41:42.897 に答える
127

varunlの現在受け入れられている回答

 >>> l = [None] * 10
 >>> l
 [None, None, None, None, None, None, None, None, None, None]

数値などの非参照型に適しています。残念ながら、リストのリストを作成したい場合は、参照エラーが発生します。Python 2.7.6 の例:

>>> a = [[]]*10
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [0], [0], [0], [0], [0], [0], [0], [0], [0]]
>>> 

ご覧のとおり、各要素は同じリスト オブジェクトを指しています。これを回避するには、各位置を異なるオブジェクト参照に初期化するメソッドを作成できます。

def init_list_of_objects(size):
    list_of_objects = list()
    for i in range(0,size):
        list_of_objects.append( list() ) #different object reference each time
    return list_of_objects


>>> a = init_list_of_objects(10)
>>> a
[[], [], [], [], [], [], [], [], [], []]
>>> a[0].append(0)
>>> a
[[0], [], [], [], [], [], [], [], [], []]
>>> 

(関数を記述する代わりに) これを行うデフォルトの組み込みの python の方法がある可能性がありますが、それが何であるかはわかりません。訂正していただけると幸いです!

編集:それは[ [] for _ in range(10)]

例 :

>>> [ [random.random() for _ in range(2) ] for _ in range(5)]
>>> [[0.7528051908943816, 0.4325669600055032], [0.510983236521753, 0.7789949902294716], [0.09475179523690558, 0.30216475640534635], [0.3996890132468158, 0.6374322093017013], [0.3374204010027543, 0.4514925173253973]]
于 2015-11-04T03:39:09.853 に答える
20

2 つの「クイック」方法があります。

x = length_of_your_list
a = [None]*x
# or
a = [None for _ in xrange(x)]

それ[None]*xはより速いようです:

>>> from timeit import timeit
>>> timeit("[None]*100",number=10000)
0.023542165756225586
>>> timeit("[None for _ in xrange(100)]",number=10000)
0.07616496086120605

しかし、範囲に問題がなければ (例: [0,1,2,3,...,x-1])、range(x)最速かもしれません:

>>> timeit("range(100)",number=10000)
0.012513160705566406
于 2016-02-15T22:38:27.640 に答える
19

.append(element)次のようにリストにアクセスできますs1.append(i)s1[i]現在実行しようとしているのは、存在しない要素 ( ) にアクセスすることです。

于 2012-05-23T00:40:21.493 に答える
18

空のリストのリストを作成するためのこの単純なアプローチを誰も提案していないことに驚いています。これは古いスレッドですが、完全を期すためにこれを追加するだけです。これにより、10個の空のリストのリストが作成されます

x = [[] for i in range(10)]
于 2017-12-11T07:14:02.507 に答える
6

(これは、質問の元のバージョンに基づいて書かれています。)

10 個の要素を保持できる空のリスト (または最善の方法) を作成したいと考えています。

すべてのリストは、使用可能なメモリの制限のみを条件として、好きなだけ要素を保持できます。重要なリストの唯一の「サイズ」は、現在そこにある要素の数です。

しかし、実行すると、結果は []

print display s1は有効な構文ではありません。あなたが見ているものの説明に基づいて、私はあなたが意味していたと思いdisplay(s1)ますprint s1. s1これを実行するには、関数に渡すグローバルを事前に定義しておく必要があります。

記述されているように、呼び出しdisplayによって渡されたリストが変更されることはありません。あなたのコードは、「s1は関数に渡されたものの名前です。わかりました。最初に行うことは、そのことを完全に忘れて、s1代わりに新しく作成されlistた . list"。これは、渡した値には影響しません。

ここで値を渡す理由はありません。(関数を作成する本当の理由もありませんが、それは重要ではありません。)何かを「作成」したいので、それが関数の出力です。あなたが説明するものを作成するのに情報は必要ないので、情報を渡さないでくださいreturn

それはあなたに次のようなものを与えるでしょう:

def display():
    s1 = list();
    for i in range(0, 9):
        s1[i] = i
    return s1

次に気付く問題は、range関数によってエンドポイントがスキップされるため、リストには実際には 9 つの要素しかないことです。(補足[]として、 と同様に機能しますlist()。セミコロンは不要でs1あり、変数の名前としては適切ではありません。またrange、 から開始する場合に必要なパラメーターは 1 つだけです0。)

def create_list():
    result = list()
    for i in range(10):
        result[i] = i
    return result

ただし、これにはまだマークがありません。range言語の一部である魔法のキーワードではforなくdef、関数です。そして、その関数が何を返すと思いますか? そうです - これらの整数のリストです。したがって、関数全体は次のように折りたたまれます

def create_list():
    return range(10)

これで、自分で関数をまったく作成する必要がない理由がわかりました。rangeすでに探している関数です。繰り返しますが、リストを「事前にサイズ調整」する必要も理由もありません。

于 2012-05-23T00:50:07.423 に答える
-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

リストを作成するには、これらの括弧を使用するだけです: "[]"

リストに何かを追加するには、 list.append() を使用します

于 2018-01-02T13:05:00.717 に答える