Pythonで配列を宣言する方法は?


491

Pythonで配列を宣言するにはどうすればよいですか?

ドキュメントに配列への参照が見つかりません。


121
不可解な理由により、Pythonは配列を「リスト」と呼んでいます。「誰もが知っていること、これは何と呼ばれているのか」という言語デザインの学校です。配列ではなくリンクされたリストのように見えるので、名前の選択としては特に好ましくありません。
Glenn Maynard、

42
@Glenn Maynard:Cのような言語では、配列が固定長であるのに対してPythonリストはそうではないためです。C ++のSTLベクトルまたはJavaのArrayListに似ています。
MAK

128
リストなので、リストと呼ばれます。[A()、1、 'Foo'、u'öäöäö '、67L、5.6]。リスト。配列とは、「コンピュータメモリ内の等間隔のアドレスにあるアイテムの配置」です(ウィキペディア)。
Lennart Regebro、2009年

35
普遍的に理解されている「配列」という用語については、固定長など、コンテンツについては何も示唆されていません。これらは、Cの配列の特定の実装の制限にすぎません。Pythonリストは等間隔(内部的にオブジェクトへのポインター)であるか、そうで__getitem__なければO(1)ではありません。
Glenn Maynard、

24
@ Glenn、en.wikipedia.org / wiki / Array_data_structureから:「配列データ構造の要素は同じサイズである必要があります」(Pythonの配列ではtrue、Pythonリストではtrueでない)および「有効なインデックスタプルのセットと要素のアドレス(したがって、要素のアドレス指定式)は通常、配列が使用されている間は固定されます。
Alex Martelli、

回答:


358
variable = []

今、variable空のリストを参照*

もちろん、これは宣言ではなく割り当てです。Pythonは動的に型指定されているため、Pythonでは「この変数はリスト以外のものを参照してはなりません」と言うことはできません。


*デフォルトの組み込みPythonタイプは、配列ではなくリストと呼ばれます。これは、オブジェクトの異種のコレクションを保持できる、任意の長さの順序付きコンテナです(それらのタイプは重要ではなく、自由に混合できます)。これを、C タイプに近いタイプを提供するarrayモジュールと混同しないでくださいarray。内容は同種(すべて同じタイプ)でなければなりませんが、長さは動的です。


11
JavaScriptのように、配列の内容を初期化することはできますか?(例:variable = ["Hi", "Hello"];?)
アンダーソン・グリーン

6
@AndersonGreenはい。
sepp2k 2013年

3
次に、多次元配列をどのように宣言しますか(例:2D配列?)
Anderson Green

7
@AndersonGreen前述のとおり、Pythonには変数宣言などはありません。空のリストを取り、その中に他のリストを配置して多次元リストを作成します。または、リストの次元が書き込み時にわかっている場合は、次のようなリテラルとして書き込むことができますmy_2x2_list = [[a, b], [c, d]]。多次元配列が必要な目的に応じて、を使用することを検討することもできますnumpy。これは、多次元の均一なボックス化されていない配列の配列型を定義し、該当する場合ははるかに効率的であるため、数値計算に適しています。
sepp2k 2013

1
@IfanIqbalはい、少なくとも1つの要素が含まれている場合は可能です。
sepp2k 2013年

136

これはPythonで驚くほど複雑なトピックです。

実用的な答え

配列はクラスで表されますlistリファレンスを参照して、ジェネレーターと混合しないでください)。

使用例を確認してください:

# empty array
arr = [] 

# init with values (can contain mixed types)
arr = [1, "eels"]

# get item by index (can be negative to access end of array)
arr = [1, 2, 3, 4, 5, 6]
arr[0]  # 1
arr[-1] # 6

# get length
length = len(arr)

# supports append and insert
arr.append(8)
arr.insert(6, 7)

理論的な答え

内部では、Python listはアイテムへの参照を含む実際の配列のラッパーです。また、基になる配列は、追加のスペースを使用して作成されます。

この結果は次のとおりです。

  • ランダムアクセスは本当に安いです(arr[6653]と同じですarr[0]
  • append 操作は「無料」ですが、追加のスペースがあります
  • insert 操作は高価です

この操作の複雑さの素晴らしい表を確認してください。

また、配列、参照の配列、およびリンクされたリストの最も重要な違いを示すために試みた次の図を参照してください。 アレイ、どこでもアレイ


5
追加するだけで、Pythonで配列をカットする本当にクールな方法があります。[1, 2, 3, 4, 5, 6, 7, 8, 9][1:-2]結果は次のようになります[2, 3, 4, 5, 6, 7]
Anton Purin

2
私は時々、この投稿に対するいくつかの反対票を見ています。誰かがなぜその理由を投稿できたら素晴らしいでしょう。ありがとう。
アントンプリン2016年

2
あなたは本当のMVPです。合理的なプログラミングの決定を行うために、「リスト」の実際に選択された設計を知る必要があります。基本的には、C ++の「ベクター」のようなものです。ありがとう!
ネクロ2017年

これは、いくつかの素晴らしい説明がある、本当に長い答えです!
アーメド

月Iは、例えば、比較のための実用的な表記を追加する:a == b[:2]最初の2つの要素場合にtrueを返しBは、配列の値に等しいA
ブルーノL.

124

実際に宣言することはありませんが、これはPythonで配列を作成する方法です。

from array import array
intarray = array('i')

詳細については、配列モジュールを参照してください:http : //docs.python.org/library/array.html

配列ではなくリストが必要になりましたが、他の人はすでにそれに答えています。:)


10
これはちょっとおかしいですが、「初心者」というタグの付いた質問にはあまり適していません。明確にするために:Pythonでは通常、と呼ばれるデータ型を使用しますlist。Pythonには、arrayC配列と似た特殊な目的のデータ型があり、ほとんど使用されていません。
steveha 2009年

63
いいえ、ただし他のすべての人はすでにリストを使用しています。配列もあることを指摘するのは良い答えだと思いました。
Lennart Regebro、2009年

8
この答えのスーパーマッド小道具。私は何年もPythonでプログラミングしており、つい最近になって、リストオブジェクトとは異なる実際のPython配列オブジェクトがあることに気づきました。データ構造体はよく似ていますが、配列は配列が保持できるオブジェクトのタイプを制限します。素晴らしい回答@LennartRegebro!
Josh Brown

4
これは正しい答えのはずですリストと配列は2つの異なるものです@LennartRegebroありがとう
Mina Gabriel

リストの代わりに配列を使用する特定の理由があります。具体的には、数値でいっぱいのmyarrayと呼ばれる配列がある場合、その配列に対して数学演算を実行でき、それらの演算はその内部のすべてのアイテムに適用されます。したがって、myarray / 3を実行すると、内部のすべての数値が3で除算されます。リストで同じことを行おうとすると、エラーが発生します。したがって、配列は数値の大きなデータセットに対してより効率的です。
マシュー

66

最初の30個のセルが既に入力されているリストを(意味して)ほしいと思います。そう

   f = []

   for i in range(30):
       f.append(0)

これを使用できる例は、フィボナッチシーケンスです。Project Eulerの問題2を参照


96
これは、リストを初期化するかなりバロックな方法です。f = [0] * 30代わりに試してください。
John Machin、

@slehar anwerのa = range(10)と同じではありませんか?Pythonが大好きです。構文であり、Zenです。
m3nda

@ erm3nda nope:$ python3 Python 3.4.2 [...] >>> a = range(10)>>> print(a)range(0、10)>>>
arp

37

こうやって:

my_array = [1, 'rebecca', 'allard', 15]

4
これはpython配列ではなくpythonリストなので、「my_list」と呼んでもそれほど混乱しないでしょうか?
Mattis Asp

4
これにより、配列ではなくリストが作成されます。それらは異なり、Pythonでは異なるプロパティを持っています。具体的には、配列に対して数値演算を実行できますが、リストに対しては実行できません。
マシュー

21

計算には、次のようなnumpy配列を使用します。

import numpy as np

a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3

print(a*1.5)  # all elements of a times 1.5
print(a.T+b)  # b added to the transpose of a

これらのnumpy配列はディスクから保存およびロードでき(圧縮されていても)、大量の要素を含む複雑な計算はCに似ています。

科学的環境でよく使用されます。詳細はこちらをご覧ください。


17

JohnMachinのコメントが本当の答えになるはずです。他のすべての答えは私の意見では回避策です!そう:

array=[0]*element_count

同意する。変数「配列」でさえ呼び出すか、純粋主義的な怒りを得るように注意することを除いて。これまで私はまた、あなたが同様に「多次元配列」を作成できることを追加します:x=[[0] * 10] * 10
ピーター・S Magnusson氏

17

いくつかの貢献により、Pythonの配列はリストで表されることが示唆されました。これは誤りです。Pythonはarray()標準ライブラリモジュールarray " array.array()"にの独立した実装を持っているため、2つを混同するのは誤りです。リストはpythonのリストなので、使用される命名法に注意してください。

list_01 = [4, 6.2, 7-2j, 'flo', 'cro']

list_01
Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']

listとには非常に重要な違いが1つありarray.array()ます。これらのオブジェクトは両方とも順序付けられたシーケンスですが、array.array()は順序付けられた同種のシーケンスですが、リストは不均一なシーケンスです。


16

Pythonでは何も宣言していません。あなたはそれを使うだけです。http://diveintopython.netのようなものから始めることをお勧めします。


2
場合によっては、変数の型を宣言する必要があります。それを以前に使用しなかった場合、制御構造は制御構造の外に存在しないため、新しい変数を作成します。その場合、変数はintであると想定され、より複雑な型として使用すると競合します。
2015

@Clearerはい、関数を使用すると宣言が必要になる場合があります。また、関数を使用するときに一部のグローバルを再生し、関数にあまり多くの引数を書きたくない場合もあります。
m3nda

機能だけではありません。単純なifステートメントでも同じ問題が発生する可能性があります。
2015

1
プログラミングは、どの言語を使用しているかに関係なく、すべて宣言に関するものです。型宣言はまったく別の話です
Outside_Box '15 / 08/15

このリンクは質問に回答する場合がありますが、回答の重要な部分をここに含め、参照用のリンクを提供することをお勧めします。リンクされたページが変更されると、リンクのみの回答が無効になる可能性があります。
エイドリアン・トンプキンス


11

Lennartの回答に追加するには、次のように配列を作成します。

from array import array
float_array = array("f",values)

ここで、はタプル、リスト、またはnp.arrayの形式をとることができますが、配列をとることはできません。

values = [1,2,3]
values = (1,2,3)
values = np.array([1,2,3],'f')
# 'i' will work here too, but if array is 'i' then values have to be int
wrong_values = array('f',[1,2,3])
# TypeError: 'array.array' object is not callable

そして出力は同じままです:

print(float_array)
print(float_array[1])
print(isinstance(float_array[1],float))

# array('f', [1.0, 2.0, 3.0])
# 2.0
# True

リストのほとんどのメソッドは配列でも機能し、一般的なものはpop()、extend()、append()です。

回答とコメントから判断すると、配列データ構造はそれほど一般的ではないようです。私はそれが好きですが、リストよりタプルを好むのと同じ方法です。

配列構造には、リストやnp.arrayよりも厳しい規則があります。これにより、特に数値データを扱う場合に、エラーを減らしてデバッグを容易にすることができます。

floatをint配列に挿入/追加しようとすると、TypeErrorがスローされます。

values = [1,2,3]
int_array = array("i",values)
int_array.append(float(1))
# or int_array.extend([float(1)])

# TypeError: integer argument expected, got float

整数(インデックスのリストなど)を意図した値を配列形式で保持すると、np.arrayやリストと同様に配列を反復できるため、「TypeError:リストのインデックスは浮動小数点数ではなく整数でなければならない」のを防ぐことができます。

int_array = array('i',[1,2,3])
data = [11,22,33,44,55]
sample = []
for i in int_array:
    sample.append(data[i])

厄介なことに、intをfloat配列に追加すると、intは例外をスローせずにfloatになります。

np.arrayもそのエントリに対して同じデータ型を保持しますが、エラーを出す代わりに、データ型を変更して新しいエントリ(通常はdoubleまたはstr)に合わせます。

import numpy as np
numpy_int_array = np.array([1,2,3],'i')
for i in numpy_int_array:
    print(type(i))
    # <class 'numpy.int32'>
numpy_int_array_2 = np.append(numpy_int_array,int(1))
# still <class 'numpy.int32'>
numpy_float_array = np.append(numpy_int_array,float(1))
# <class 'numpy.float64'> for all values
numpy_str_array = np.append(numpy_int_array,"1")
# <class 'numpy.str_'> for all values
data = [11,22,33,44,55]
sample = []
for i in numpy_int_array_2:
    sample.append(data[i])
    # no problem here, but TypeError for the other two

これは、割り当ての間にも当てはまります。データ型が指定されている場合、np.arrayは可能な限り、エントリをそのデータ型に変換します。

int_numpy_array = np.array([1,2,float(3)],'i')
# 3 becomes an int
int_numpy_array_2 = np.array([1,2,3.9],'i')
# 3.9 gets truncated to 3 (same as int(3.9))
invalid_array = np.array([1,2,"string"],'i')
# ValueError: invalid literal for int() with base 10: 'string'
# Same error as int('string')
str_numpy_array = np.array([1,2,3],'str')
print(str_numpy_array)
print([type(i) for i in str_numpy_array])
# ['1' '2' '3']
# <class 'numpy.str_'>

または、本質的に:

data = [1.2,3.4,5.6]
list_1 = np.array(data,'i').tolist()
list_2 = [int(i) for i in data]
print(list_1 == list_2)
# True

一方、配列は単に次のようになります:

invalid_array = array([1,2,3.9],'i')
# TypeError: integer argument expected, got float

このため、タイプ固有のコマンドにnp.arrayを使用することはお勧めできません。ここでは、配列構造が役立ちます。リストは値のデータ型を保持します。

そして、私がかなり厄介なことを見つけた場合、データ型はarray()の最初の引数として指定されますが、(通常)np.array()の2番目の引数として指定されます。:|

Cとの関係はここで参照されています: Pythonリストと配列-いつ使用するのですか?

探索を楽しんでください!

注:配列の型付きで厳密な性質は、PythonではなくCに傾いています。設計上、Pythonの関数には型固有の制約が多くありません。その不人気はまた、共同作業において肯定的なフィードバックを生み出し、それを置き換えるには、追加の[int(x)for x in file]がほとんど含まれます。したがって、配列の存在を無視することは完全に実行可能で合理的です。それはほとんどの場合私たちのほとんどを妨げるべきではありません。:D


8

これはどう...

>>> a = range(12)
>>> a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> a[7]
6



4

文字列の配列があり、Trueに開始される同じ長さのブール値の配列が必要でした。これは私がやったことです

strs = ["Hi","Bye"] 
bools = [ True for s in strs ]

私はC宣言を求めていたのでここにいます。int count[26]={0}; おそらくもっと良い方法がありますがbools、上からのこのバリアントは機能しましたが、 count=[0 for ii in range(26)]後でそれを変更して、count=[0]*26望ましいと思われます。
user1683793

2

リストを作成して配列に変換するか、numpyモジュールを使用して配列を作成できます。以下は、同じことを示すいくつかの例です。Numpyは、多次元配列の操作も簡単にします。

import numpy as np
a = np.array([1, 2, 3, 4])

#For custom inputs
a = np.array([int(x) for x in input().split()])

また、行列の次元として入力を取り込むreshape関数を使用して、この配列を2X2行列に再形成することもできます。

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