Это невероятно простой вопрос (я новичок в Python).
В основном мне нужна структура данных, такая как массив PHP, то есть я хочу инициализировать ее, а затем просто добавлять в нее значения.
Насколько я могу судить, это невозможно с Python, поэтому у меня есть максимальное значение, которое я мог бы использовать в качестве индекса, но я не могу понять, как создать пустой список указанной длины.
Кроме того, является ли список правильной структурой данных для моделирования того, что, по ощущениям, должно быть просто массивом? Я попытался использовать массив, но мне показалось, что он не доволен хранением строк.
Обновлено: извините, я не очень четко объяснил, что искал. Когда я добавляю элементы в список, я не хочу размещать их последовательно, а скорее хочу вставить их в указанные слоты в списке.
То есть, я хочу уметь это делать:
list = []
for row in rows:
c = list_of_categories.index(row["id"])
print c
list[c] = row["name"]






Используйте конструктор списка и добавьте свои элементы, например:
l = list ()
l.append ("foo")
l.append (3)
print (l)
дает мне ['foo', 3], который должен быть тем, что вы хотите. См. документация в списке и документация по типу последовательности.
РЕДАКТИРОВАТЬ Обновлено
Для прошивки используйте insert, вот так:
l = list ()
l.append ("foo")
l.append (3)
l.insert (1, "new")
print (l)
который печатает ['foo', 'new', 3]
Извините: я не очень хорошо объяснил, что мне нужно. Я не хочу добавлять элементы, а скорее вставляю их в указанные слоты в массиве. Я добавил более подробную информацию к своему вопросу.
Вы можете использовать этот синтаксис для создания списка с элементами n:
lst = [0] * n
Но будь осторожен! В списке будут n копии этого объекта. Если этот объект является изменяемым и вы измените один элемент, то все копии будут изменены! В этом случае вам следует использовать:
lst = [some_object() for i in xrange(n)]
Затем вы можете получить доступ к этим элементам:
for i in xrange(n):
lst[i] += 1
Список Python сопоставим с вектором на других языках. Это массив изменяемого размера, а не связанный список.
http://diveintopython3.ep.io/native-datatypes.html#lists
Вам не нужно создавать пустые списки заданной длины. Вы просто добавляете их и при необходимости запрашиваете их текущую длину.
Что вы не можете сделать, не подготовившись к перехвату исключения, так это использовать несуществующий индекс. Вероятно, это то, к чему вы привыкли в PHP.
Совершенно верно - моя настоящая проблема - это несуществующий индекс.
Если количество элементов, которые вам нужны, известно заранее, и вы хотите получить к ним доступ, используя целочисленные, основанные на 0, последовательные индексы, вы можете попробовать следующее:
n = 3
array = n * [None]
print array
array[2] = 11
array[1] = 47
array[0] = 42
print array
Это печатает:
[None, None, None]
[42, 47, 11]
В зависимости от того, как вы собираетесь использовать список, может оказаться, что вам действительно нужен словарь. Это будет работать:
d = {}
for row in rows:
c = list_of_categories.index(row["id"])
print c
d[c] = row["name"]
... или более компактно:
d = dict((list_of_categories.index(row['id']), row['name']) for row in rows)
print d
Массивы PHP больше похожи на dicts Python, чем на списки Python. Например, у них могут быть строки для ключей.
И что сбивает с толку, в Python есть модуль массива, который описывается как «эффективные массивы числовых значений», что определенно не то, что вам нужно.
Если вы хотите проиндексировать списки категорий по имени строки, выполните: d [row ["name"]] = c
Ах ... это похоже на то, что мне нужно. Я попробую. Спасибо!
Отлично - это сделало свою работу. Спасибо!
Похоже, что вам может понадобиться Словарь, а не массив, если вы хотите вставить в указанные индексы.
dict = {'a': 1, 'b': 2, 'c': 3}
dict['a']
1
Я согласен с Недом в том, что вам, вероятно, понадобится словарь для того, что вы пытаетесь сделать. Но вот способ получить список тех списков категорий, которые вы можете сделать:
lst = [list_of_categories.index(row["id"]) for row in rows]
используйте словарь, потому что то, что вы действительно просите, - это структура, к которой вы можете получить доступ с помощью произвольных ключей
list = {}
for row in rows:
c = list_of_categories.index(row["id"])
print c
list[c] = row["name"]
Затем вы можете перебирать известное содержимое с помощью:
for x in list.values():
print x
Или проверьте, есть ли что-то в "списке":
if 3 in list:
print "it's there"
Я не уверен, понял ли я, что вы имеете в виду или хотите сделать, но похоже, что вам нужен список, который подобен словарю, где индекс является ключом. Даже если я думаю, использование словаря было бы лучше выбор, вот мой ответ: Возникла проблема - сделать объект:
class MyList(UserList.UserList):
NO_ITEM = 'noitem'
def insertAt(self, item, index):
length = len(self)
if index < length:
self[index] = item
elif index == length:
self.append(item)
else:
for i in range(0, index-length):
self.append(self.NO_ITEM)
self.append(item)
Может какие-то ошибки в синтаксисе питона (не проверял), но в принципе должно работать. Конечно, случай else работает и для elif, но я подумал, что это может быть немного сложнее читать таким образом.
Да, это похоже на разреженный массив, а не на список (в списках нет дыр, в запасных массивах есть). Таким образом, предложение Неда об использовании словаря кажется разумным, если я правильно помню, как реализованы массивы php.