Pythonで特定のサイズの空のリストを作成する


546

10個の要素を保持できる空のリスト(または最良の方法は何でも)を作成します。

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

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

print  s1

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

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



7
「空のリスト」([])には、定義上、要素はありません。何が明らかにしたいことはfalsyのような値のリストであるNone0または''
dan04

から0へのリストを生成する9にはfor i in range(0, 10)、実際にを使用する必要がありますfor (int i = 0, i < 10, i++)
Atcold 2017

回答:


833

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]

17
「lst [i] =何かのようなリストに割り当てることはできない」とはどういう意味ですか-もちろんできます!できないことは、現在のリストの長さを超えて存在しない要素に割り当てることです
Sergey

5
「リストが少なくともi + 1要素ですでに初期化されていない限り」...
MrR '10 / 10/30

5
あなたはこれを行うことができます:a = [0 for _ in range(10)]
Kamiar

list()関数を使用してこれを行うことは可能ですか?
Raul Chiarella

126

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

lst = [None] * 10

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

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

確かに、それはPythonicによる方法ではありません。これを行うほうがよい:

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

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

lst = range(10)

そしてPython 3.xでは:

lst = list(range(10))

2
これに関するもう1つの優れた点は、リストをデフォルト値で初期化できることです。lst = [''] * 10またはlst = [0] * 10
Anthony Manning-Franklin

2
理解度の例のバリアント。初期化時に配列内のすべての要素を空にする必要がある場合は、次を使用しますarr = [None for _ in range(10)]
Doug R.

86

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

19
append頻繁に使用することは理解度をリストするよりも劣ると聞いた。を使用して、リストのリストを作成できます[ [] for _ in range(10)]
M.Herzkamp

10
同じデータが複数回繰り返された多次元配列があり、最終的にこの答えが見つかる前に何が起こっているのか理解できなかったので、気が狂ったので賛成です。
Bregalad 2017

19

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


16

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

Python3 list(range(n))では、range()リストを返さないがイテレータなので、代わりに使用する必要があることに注意してください[None] * n
スキルモンはtopanswers.xyz

10

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

x = [[] for i in range(10)]

7
上記と実行の最も重要な違いx = [[]] * 10は、後者では、リストの各要素がSAMEリストオブジェクトを指していることです。したがって、同じオブジェクトの10個のコピーが必要なだけでない限り、range10個の新しいオブジェクトを作成するため、ベースのバリアントを使用します。私はこの区別が非常に重要であると感じました。
Mandeep Sandhu

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言語の一部だいくつかの魔法のキーワードが方法ではありませんfordefしているが、代わりにそれは機能です。そして、その関数が返すものを推測しますか?そうです-それらの整数のリスト。したがって、関数全体が次のように折りたたまれます

def create_list():
    return range(10)

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


4

nネストされたリスト内包表記を使用してサイズの2D行列を作成する簡単な方法の1つ:

m = [[None for _ in range(n)] for _ in range(n)]

3

初期化されたリストを作成する最も簡単な方法がこれらの答えのいずれにもないことに少し驚いています。list関数でジェネレータを使用するだけです:

list(range(9))

1
なぜ誰もがまだこれについてコメントしているのかちょっと気になります...私はpythonの初心者です。私はこれが進むべき道のように見えますが、誰も何も言いません。多分レンジ関数は高価なものかもしれませんか?
AFP_555

3
この問題は、この回答では質問ごとに空のリストが作成されないため、[0、1、2、3、4、5、6、7、8]となるため、range(9)関数が実行します。Nonesのリストをインスタンス化するとすぐに数値で埋めるよりも便利だと仮定
Spcogg、2

なぜラップrange(9)ではlist()range(9)リストはまだ返されませんか?
Zyl、

2
@Zyl rangeはリストでもジェネレータでもありません。これは、の組み込みの不変サブクラスですSequence
ヌーノアンドレ

1
@ AFP_555本当の質問は、それが実際には質問に答えておらず、意図しない悪い結果をもたらす可能性があるため、それ以上ダウン投票されない理由だと思います。
エリック

1

これは、Pythonでの2Dリストのコードです。入力からの行数:

empty = []
row = int(input())

for i in range(row):
    temp = list(map(int, input().split()))
    empty.append(temp)

for i in empty:
    for j in i:
        print(j, end=' ')
    print('')

0

受け入れられた答えはいくつかの落とし穴があります。例えば:

>>> a = [{}] * 3
>>> a
[{}, {}, {}]
>>> a[0]['hello'] = 5
>>> a
[{'hello': 5}, {'hello': 5}, {'hello': 5}]
>>> 

したがって、各辞書は同じオブジェクトを参照します。配列またはオブジェクトで初期化する場合も同様です。

代わりにこれを行うことができます:

>>> b = [{} for i in range(0, 3)]
>>> b
[{}, {}, {}]
>>> b[0]['hello'] = 6
>>> b
[{'hello': 6}, {}, {}]
>>> 

-2

同様の問題を探しているときに、このSOの質問に出くわしました。2D配列を作成し、各リスト(2D配列内)のいくつかの要素をdictの要素で置き換える必要がありました。私はそれから私を助けたこの SOの質問に出くわしました、おそらくこれは他の初心者が回避するのを助けるでしょう。重要なトリックは、2D配列をnumpy配列として初期化し、のarray[i,j]代わりに使用することでしたarray[i][j]

参考までに、これは私がこれを使用しなければならなかったコードの一部です:

nd_array = []
for i in range(30):
    nd_array.append(np.zeros(shape = (32,1)))
new_array = []
for i in range(len(lines)):
    new_array.append(nd_array)
new_array = np.asarray(new_array)
for i in range(len(lines)):
    splits = lines[i].split(' ')
    for j in range(len(splits)):
        #print(new_array[i][j])
        new_array[i,j] = final_embeddings[dictionary[str(splits[j])]-1].reshape(32,1)

これでリスト内包表記を使用できることがわかりましたが、簡単にするためにネストしたforループを使用しています。これがこの投稿に遭遇した他の人に役立つことを願っています。


-2

関数として再利用しやすくします。

def createEmptyList(length,fill=None):
    '''
    return a (empty) list of a given length
    Example:
        print createEmptyList(3,-1)
        >> [-1, -1, -1]
        print createEmptyList(4)
        >> [None, None, None, None]
    '''
    return [fill] * length

-3
s1 = []
for i in range(11):
   s1.append(i)

print s1

リストを作成するには、次の角かっこを使用します: "[]"

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


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.