Я хотел бы знать, как я могу инициализировать массив (или список), но для заполнения значениями иметь определенный размер.
например, в C:
int x[5]; /* declared without adding elements*/
Как это сделать в python?
Спасибо.
Я хотел бы знать, как я могу инициализировать массив (или список), но для заполнения значениями иметь определенный размер.
например, в 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, который может хранить объекты. Это не может быть изменено или добавлено. В частности, он не теряет пространство, дополняя его длину. Это Python эквивалент Java
Object[] a = new Object[n];
Если вы действительно заинтересованы в производительности и пространстве и знаете, что ваш массив будет хранить только определенные числовые типы, вы можете изменить аргумент dtype на другое значение, например, int. Затем 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 является двумерным массивом, а y является одномерным массивом. Они оба инициализируются нулями.
Простое решение x = [None]*length
, но обратите внимание, что оно инициализирует все элементы списка None
. Если размер действительно исправлен, вы можете сделать x=[None,None,None,None,None]
. Но, строго говоря, вы не получите элементов undefined в любом случае, потому что эта чума не существует в 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]
на 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
Надеюсь, это поможет..!!;)
Вы можете попробовать использовать дескриптор, чтобы ограничить размер
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]
Одна вещь, которую мне легко найти, - это установить массив пустых строк для размера, который я предпочитаю, например
код:
import numpy as np
x= np.zeros(5,str)
print x
Вывод:
['' '' '' '' '']
Надеюсь, что это будет полезно:)
Если вы работаете с байтами, вы можете использовать встроенный bytearray
. Если вы работаете с другими интегральными типами, посмотрите на встроенный array
.
В частности, понимаем, что a list
не является array
.
Если, например, вы пытаетесь создать буфер для чтения содержимого файла, вы можете использовать bytearray следующим образом (есть более эффективные способы сделать это, но пример действителен):
with open(FILENAME, 'rb') as f:
data = bytearray(os.path.getsize(FILENAME))
f.readinto(data)
В этом фрагменте память bytearray
предопределена с фиксированной длиной FILENAME
в байтах. Это предварительное распределение позволяет использовать буферный протокол для более эффективного считывания файла в изменяемый буфер без копии массива. Есть еще лучшие способы сделать это, но я считаю, что это дает один ответ на ваш вопрос.