私はどのように私は配列(またはリスト)を初期化することができるか、まだ定義されたサイズを持つために、値で埋められることを知りたいです。
例えばCでは:
int x[5]; /* declared without adding elements*/
どのように私はPythonでそれをするのですか?
ありがとう。
あなたが使用することができます:
>>> lst = [None] * 5
>>> lst
[None, None, None, None, None]
なぜこれらの質問は明白な答えで答えられないのですか?
a = numpy.empty(n, dtype=object)
これにより、オブジェクトを格納できる長さnの配列が作成されます。サイズ変更や追加はできません。特に、その長さを埋めることによってスペースを無駄にしません。これは、Javaと同等です。
Object[] a = new Object[n];
あなたが本当にパフォーマンスとスペースに興味があり、あなたの配列が特定の数値型を格納するだけであることを知っているなら、あなたはintのような他の値にdtype引数を変更することができます。その場合、numpyは、配列をintオブジェクトに参照させるのではなく、これらの要素を配列に直接パックします。
これを行う:
>>> d = [ [ None for y in range( 2 ) ] for x in range( 2 ) ]
>>> d
[[None, None], [None, None]]
>>> d[0][0] = 1
>>> d
[[1, None], [None, None]]
他の解決策はこの種の問題を引き起こすでしょう:
>>> d = [ [ None ] * 2 ] * 2
>>> d
[[None, None], [None, None]]
>>> d[0][0] = 1
>>> d
[[1, None], [1, None]]
最善の策は、 numpy ライブラリを使用することです。
from numpy import ndarray
a = ndarray((5,),int)
>>> import numpy
>>> x = numpy.zeros((3,4))
>>> x
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
>>> y = numpy.zeros(5)
>>> y
array([ 0., 0., 0., 0., 0.])
xは2次元配列、yは1次元配列です。どちらもゼロで初期化されます。
簡単な解決策はx = [None]*length
ですが、これはすべてのリスト要素をNone
に初期化することに注意してください。サイズが本当に fixedであれば、x=[None,None,None,None,None]
もできます。しかし厳密に言えば、この疫病はPythonには存在しないので、どちらにしても未定義の要素を取得することはできません。
>>> n = 5 #length of list
>>> list = [None] * n #populate list, length n with n entries "None"
>>> print(list)
[None, None, None, None, None]
>>> list.append(1) #append 1 to right side of list
>>> list = list[-n:] #redefine list as the last n elements of list
>>> print(list)
[None, None, None, None, 1]
>>> list.append(1) #append 1 to right side of list
>>> list = list[-n:] #redefine list as the last n elements of list
>>> print(list)
[None, None, None, 1, 1]
>>> list.append(1) #append 1 to right side of list
>>> list = list[-n:] #redefine list as the last n elements of list
>>> print(list)
[None, None, 1, 1, 1]
または、リスト内に実際に何もない状態で始まるもの:
>>> n = 5 #length of list
>>> list = [] # create list
>>> print(list)
[]
>>> list.append(1) #append 1 to right side of list
>>> list = list[-n:] #redefine list as the last n elements of list
>>> print(list)
[1]
appendの4回目の繰り返し:
>>> list.append(1) #append 1 to right side of list
>>> list = list[-n:] #redefine list as the last n elements of list
>>> print(list)
[1,1,1,1]
5以降
>>> list.append(1) #append 1 to right side of list
>>> list = list[-n:] #redefine list as the last n elements of list
>>> print(list)
[1,1,1,1,1]
それでは、サンプルプログラムとそのアウトプットを投稿することであなたを助けたいと思います。
プログラム:
t = input("")
x = [None]*t
y = [[None]*t]*t
for i in range(1, t+1):
x[i-1] = i;
for j in range(1, t+1):
y[i-1][j-1] = j;
print x
print y
出力: -
2
[1, 2]
[[1, 2], [1, 2]]
私はこれが彼らの宣言に関してあなたのいくつかの非常に基本的な概念をクリアすることを願っています。 0
でそれらを初期化するように、他の特定の値でそれらを初期化するためにあなたはそれらを宣言することができます:
x = [0]*10
それが役に立てば幸い..!! ;)
サイズを制限するためにDescriptorを使ってみることができます
class fixedSizeArray(object):
def __init__(self, arraySize=5):
self.arraySize = arraySize
self.array = [None] * self.arraySize
def __repr__(self):
return str(self.array)
def __get__(self, instance, owner):
return self.array
def append(self, index=None, value=None):
print "Append Operation cannot be performed on fixed size array"
return
def insert(self, index=None, value=None):
if not index and index - 1 not in xrange(self.arraySize):
print 'invalid Index or Array Size Exceeded'
return
try:
self.array[index] = value
except:
print 'This is Fixed Size Array: Please Use the available Indices'
arr = fixedSizeArray(5)
print arr
arr.append(100)
print arr
arr.insert(1, 200)
print arr
arr.insert(5, 300)
print arr
出力:
[None, None, None, None, None]
Append Operation cannot be performed on fixed size array
[None, None, None, None, None]
[None, 200, None, None, None]
This is Fixed Size Array: Please Use the available Indices
[None, 200, None, None, None]
簡単にできることの1つは、私が好むサイズに空の文字列の配列を設定することです。
コード:
import numpy as np
x= np.zeros(5,str)
print x
出力:
['' '' '' '' '']
これが役に立つことを願っています:)
バイトを扱う場合は、組み込みのbytearray
を使うことができます。他の整数型を使っているのなら、組み込みのarray
を見てください。
list
はarray
ではないことを明確に理解してください。
たとえば、ファイルの内容を読み込むためのバッファを作成しようとしている場合は、次のようにbytearrayを使用できます(これを実行するより良い方法がありますが、例は有効です)。
with open(FILENAME, 'rb') as f:
data = bytearray(os.path.getsize(FILENAME))
f.readinto(data)
このスニペットでは、bytearray
メモリに、固定長のFILENAME
sサイズ(バイト単位)が事前に割り当てられています。この事前割り当てにより、バッファコピープロトコルを使用して、配列をコピーせずにファイルを可変バッファに効率的に読み込むことができます。これを行うより良い方法がまだありますが、私はこれがあなたの質問に対する一つの答えを提供すると信じています。