web-dev-qa-db-ja.com

pythonで固定サイズの配列を初期化する

私はどのように私は配列(またはリスト)を初期化することができるか、まだ定義されたサイズを持つために、値で埋められることを知りたいです。

例えばCでは:

int x[5]; /* declared without adding elements*/

どのように私はPythonでそれをするのですか?

ありがとう。

125
kbb

あなたが使用することができます:

>>> lst = [None] * 5
>>> lst
[None, None, None, None, None]
158
samplebias

なぜこれらの質問は明白な答えで答えられないのですか?

a = numpy.empty(n, dtype=object)

これにより、オブジェクトを格納できる長さnの配列が作成されます。サイズ変更や追加はできません。特に、その長さを埋めることによってスペースを無駄にしません。これは、Javaと同等です。

Object[] a = new Object[n];

あなたが本当にパフォーマンスとスペースに興味があり、あなたの配列が特定の数値型を格納するだけであることを知っているなら、あなたはintのような他の値にdtype引数を変更することができます。その場合、numpyは、配列をintオブジェクトに参照させるのではなく、これらの要素を配列に直接パックします。

65
Pat Morin

これを行う:

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

最善の策は、 numpy ライブラリを使用することです。

from numpy import ndarray

a = ndarray((5,),int)
12
lafras
>>> 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次元配列です。どちらもゼロで初期化されます。

10
kaamen

簡単な解決策はx = [None]*lengthですが、これはすべてのリスト要素をNoneに初期化することに注意してください。サイズが本当に fixedであれば、x=[None,None,None,None,None]もできます。しかし厳密に言えば、この疫病はPythonには存在しないので、どちらにしても未定義の要素を取得することはできません。

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

それでは、サンプルプログラムとそのアウトプットを投稿することであなたを助けたいと思います。

プログラム:

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

それが役に立てば幸い..!! ;)

3
Archit

サイズを制限するために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
Siva Cn

簡単にできることの1つは、私が好むサイズに空の文字列の配列を設定することです。

コード:

import numpy as np

x= np.zeros(5,str)
print x

出力:

['' '' '' '' '']

これが役に立つことを願っています:)

0
Pfesi van Zyl

バイトを扱う場合は、組み込みのbytearrayを使うことができます。他の整数型を使っているのなら、組み込みのarrayを見てください。

listarrayではないことを明確に理解してください。

たとえば、ファイルの内容を読み込むためのバッファを作成しようとしている場合は、次のようにbytearrayを使用できます(これを実行するより良い方法がありますが、例は有効です)。

with open(FILENAME, 'rb') as f:
    data = bytearray(os.path.getsize(FILENAME))
    f.readinto(data)

このスニペットでは、bytearrayメモリに、固定長のFILENAMEsサイズ(バイト単位)が事前に割り当てられています。この事前割り当てにより、バッファコピープロトコルを使用して、配列をコピーせずにファイルを可変バッファに効率的に読み込むことができます。これを行うより良い方法がまだありますが、私はこれがあなたの質問に対する一つの答えを提供すると信じています。

0
Dave